基于微控制器的升压转换器的制作教程

电子说

1.3w人已加入

描述

步骤1:基本原理

Wikipedia对该原理进行了很好的解释,但是这里有一个快速指南:

升压转换器可快速打开和关闭开关。 (我的设计以65kHz运行。)

开关闭合时(第一幅图),它在输入电源两端连接一个电感,而二极管则阻止任何电流从输出侧回流。

电感器充电。 (尽管在输入端短接一根线圈的线圈似乎会浪费很多功率,但电感器实际上会将能量存储在其内核中。)

当开关断开时,电感器会抵抗任何变化电流(并且将其短接在电源上意味着它有很多电流通过)。由于输出侧的电阻比开关高得多,因此电感器必须提高其电压以保持电流流动。 (通过改变电压来阻止电流变化是电感器的神奇特性。)

输出电容器从电感器和更高电压的电源中充电。

当开关再次接通时,电容器将以较高的电压充电并为负载供电,直到下一个周期。由于电源仅在时间的一部分上施加到输出侧,因此输出电压上始终会出现纹波。

如果开关在每个周期中导通时间相对较长(其占空比较高),则电感器会存储更多能量,从而在开关断开时会产生更高的输出电压。通过控制占空比,可以调整电压。

就原理而言,您如何将其变成真实的电路?

第2步:选择关键组件

为获得准确值,我整理了一个Google电子表格模板,该模板可通过TI进行计算指南。下面,我尝试总结阅读文档并四处搜索后收集的经验法则。

电感器

电感器是电路中最重要的部分。

它的标题值是它的电感,以亨利为单位。电子表格将帮助您计算正确的值。我建议将计算值设为1.5-2倍,以便有一定的余量。

您还需要签出:

额定电流,该电流必须足以处理电感中的峰值电流(由电子表格计算)。

形状:之所以选择环形线圈,是因为它们应该具有较低的EMF干扰。我读过的一位消息人士说,如果您不担心干扰,则线轴电感器是最好的选择。

核心材料是您想要的一种适合功率电感器的材料。我去买了一个作为功率电感器销售的环形线圈。我相信它具有铁氧体磁芯。

我使用了这个150uH电感器。

开关

这是电路中第二重要的部分,以及我第一次犯错的地方。 MOSFET是一个不错的选择,因为它很容易用微控制器驱动。您需要注意以下几点:

Rds(on)这很关键,它是开关打开时的电阻。我的第一次尝试是因为这里的值太高而使人sc目结舌。 《10mOhm是理想的。如果该值太高,则电感器将无法吸收足够的电流,从而浪费了开关中的功率。

Vgs(th)值,这是您必须施加到晶体管栅极以使其导通的电压。如果您使用的是5V微控制器,则该电压必须为1-2V。

Vds(max),这是晶体管可以处理的最大电压,用于输出电压加上一些安全裕度。

Ids(max),即开关可以处理的最大电流。根据电子表格,该值必须大于峰值电流。

我使用了此开关。

电容器

电子表格应计算电路中电容器的最小值。我发现,为音频放大器供电时,我需要的输出容量要比指定的容量大得多。

输出级的电容器需要具有低ESR值才能提高效率。

我选择了一个大的ESR低的电解电容器,然后与22uF陶瓷电容器并联,希望进一步过滤输出。

在输入端,我使用了相同的设置。

二极管

二极管非常简单,只需肖特基二极管即可,它可以处理平均电流并且正向电压低(450mV似乎是极限。非异国情调的部分)。

微控制器

我之所以选择ATTiny84A,是因为它可用通孔包装提供,它的体积不太大,并且AVR GCC工具链还不错。我遵循Lady Ada的本教程来启动并运行该工具链,并使用AVR Eclipse开发了代码。我需要对硬件进行相当精确的控制,以使PWM以65kHz的频率运行,因此使用更抽象的Arduino IDE可能会比较困难。

步骤3:

这是我想到的电路。

本质上,微控制器(后面的代码。..)使用其PWM输出来控制开关。

它通过反馈电位计使用其ADC监视输出电压。

如果电压降至目标以下,则会增加PWM的占空比,从而增加电感器中的电流,从而增加输出电压。

如果电压超过目标值,则会降低占空比。

可以通过调节电位器来调节电压。

输出上的440欧姆电阻可确保转换器上始终有一些负载。我通过反复试验发现了这一价值。如果我没有从中汲取足够的负载,我的5V输入电源将关闭。您也许可以克服更大的阻力。不过,加载输出至关重要。空载时,转换器将变得不稳定,电感器将输出非常大的电压。

与大电容器并联的小电容器是滤波电容器。大型电解槽具有较高的电阻,因此,将一个小的陶瓷或聚合物盖并联放置有助于应对瞬态尖峰。

ADC输入上的0.1uF电容只是一个滤波器。

为照片质量差而致歉!我很兴奋,它能起作用,所以在拍好照片之前将其密封在项目中。

步骤4:单片机代码

我已经将工作代码放入了在Github上。它由几个部分组成:

这些#defines和const声明进行编译时计算,因此代码只需要执行简单的uint8_t比较,而不需要浮点数,这在微控制器中是不可行的。使用const会鼓励编译器在编译时进行计算,并将结果类型强制为uint8_t。

#define PWM_FREQ 62500

#define PWM_RESOLUTION(F_CPU/PWM_FREQ)

#定义MIN_DUTY_CYCLE 0.40

#定义MAX_DUTY_CYCLE 0.80

常量#define DIVIDER_RATIO 30.0

#define DESIRED_ADC_IN_V(DESIRED_VOUT/DIVIDER_RATIO) const uint8_t DESIRED_ADC_RESULT = 255 * DESIRED_ADC_IN_V/VREF;

这些定义了一些有用的实用程序宏,因此

#define DUTY_CYCLE_REG OCR0B

#define ADC_ENABLE()(ADCSRA | = _BV(ADEN))

#define ADC_START_CONVERSION()(ADCSRA | = _BV(ADSC) ))

主要功能有一个初始设置阶段,在该阶段它将打开我们需要的各种外围设备:

i nt main(void){

/*将A7设置为输出。 (需要PWM。)*/

DDRA | = _BV(DD7);

PORTA = 0;

/*让输入功率稳定。.. */

_delay_ms(500);

/*

*将Timer0配置为快速PWM。它将

*-在每个周期开始时打开输出引脚

*-当值达到DUTY_CYCLE_REG

时将其关闭*-达到OCR0A

时将其包装为0 */

TCCR0A = _BV(COM0B1)| _BV(WGM01)| _BV(WGM00);

OCR0A = PWM_RESOLUTION;

/*从40%的占空比开始,然后逐渐上升以避免涌入。 */

DUTY_CYCLE_REG =(uint8_t)(PWM_RESOLUTION * 0.40);

/*将Timer0时钟源设置为主振荡器。这将启用计时器。 */

TCCR0B = _BV(CS00)| _BV(WGM02);

/*

*打开ADC,

*-使用内部参考电压

*-将ADC0配置为我们的电源

*-左调整结果,

*-禁用引脚上的数字输入缓冲器

*-启用ADC。

*/

ADMUX =/* REF = */_BV(REFS1)|/* INPUT = */0;

ADCSRA | =/* PRESCALER = 16 = 2 ^ */4;

ADCSRB | =/*左调整*/_BV(ADLAR);

DDRA&= 〜_BV(DD0);

DIDR0 | = _BV(ADC0D);

ADC_ENABLE();

_delay_ms(1);

然后,它简单地循环读取电位计的模拟值并将其与目标值进行比较:

而(1){

/*等待Timer0溢出。.. */

loop_until_bit_is_set(TIFR0 ,TOV0);

/*我们的OFF周期结束时,应该是峰值电压。.. */

TIFR0 | = _BV(TOV0);/*清除标志。 */

/*检查输出电压。 */

ADC_START_CONVERSION();

loop_until_bit_is_clear(ADCSRA,ADSC);

uint8_t adc_result = ADCH;

如果(adc_result DUTY_CYCLE_REG }

否则,如果(adc_result》 DESIRED_ADC_RESULT &&

DUTY_CYCLE_REG》 MIN_PWM_LEVEL){

DUTY_CYCLE_REG--;

}

}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分