步骤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--;
}
}
}
-
微控制器
+关注
关注
48文章
7469浏览量
150917 -
升压转换器
+关注
关注
2文章
649浏览量
34858
发布评论请先 登录
相关推荐
评论