上大学之后忙成了Doge 很少来论坛转悠
最近稍微空闲于是就鼓捣了一个简易的升压电路 可以用于移动电源
STM8S103F3素一种TSSOP20封装(很小的QwQ)的8位单片机, 具有价格低|外设多|开发方便(有固件库)以及宽工作电压等优点,平均只要1块多就能买一片的
这货里面有3个定时器,一个UART串口,一个I2C串口,一个SPI串口,一个10位16通道的高速ADC(由于封装用不到16通道),还有看门Doge等, 几乎每一个IO口都有自己的外部中断, 内部多个始终源,简直用不完的赶脚啊
这里暂时只用了两个定时器和ADC:
TIM1这个高级16位定时器用于产生固定频率可变占空比的PWM波,通过一个引脚进行输出
TIM4这个普通8位定时器用于隔一段时间进行PI运算从而稳定输出电压
ADC中的4通道(AIN4)用于检测输出电压,而3通道(AIN3)用于提供一个参考电压,约0.6-0.7V,这个电压利用二极管正向导通压降产生的
为什么还需要一个参考电压呢? 因为ADC出来的结果是一个整数, 还需要乘以单片机电源电压再除以2的10次放才是真正的电压. 单片机的供电可能不稳定, 如果没有这个参考,那可能会造成输出不稳定.
下面是电路图,非常简单没有一个多余的原件哦:
程序方面的话也很简单, 就是配置好定时器TIM1 TIM4还有ADC即可, 然后在TIM4中定时运行PID算法.
初始化TIM1, 由主时钟直接驱动不分频, 把它弄成向上计数模式,
TIM1_TimeBaseInit(0, TIM1_COUNTERMODE_UP, DUTYCYCLE_RESOLUTION, 0);
然后把输出通道1配置成PWM模式,高电平有效,同时开启反向的输出,可以给同步整流的管子用哦w
TIM1_OC1Init (TIM1_OCMODE_PWM1,
TIM1_OUTPUTSTATE_ENABLE,
TIM1_OUTPUTNSTATE_ENABLE,
0,
TIM1_OCPOLARITY_HIGH,
TIM1_OCPOLARITY_HIGH,
TIM1_OCIDLESTATE_RESET,
TIM1_OCIDLESTATE_RESET);
启动定时器和PWM输出
TIM1_CtrlPWMOutputs(ENABLE);
TIM1_Cmd(ENABLE);
设置占空比为1
TIM1_SetCompare1(1);
初始化TIM4, 由64次分频的主时钟驱动,当计数到达255的时候触发一次中断
TIM4_TimeBaseInit(TIM4_PRESCALER_64, 0xFF);
上来就得触发一次更新事件还有中断,让TIM4_PRESCALER_64这货生效
TIM4_SetCounter(0xFF);
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
开总中断
rim();
开TIM4
TIM4_Cmd(ENABLE);
PWM的频率素如何计算的:
STM8中的主时钟为16MHz, 内置的, 本制作中让STM8全速工作:
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
也就是说,驱动TIM1的预分频器的频率为16MHz,然后窝没让它分频,当计数到320时自动重装计数器的值,也就是说PWM频率=16MHz/320=50KHz, PWM的分辨率为100/320%
PID素怎么撸的:
PID素一种广泛应用的控制算法, 据说其历史有100多年了?(雾
优点素不需要建立复杂的数学模型, 世界上大部分PID控制器靠良好的P I D系数整定就能工作的很好
这里只用到了PI,其实为了快速响应,还是应该加上D的,不过窝时间少啪麻烦没加, 有兴趣的同学可以试试看
Kp和Ki得从小往大调,保证不震荡的情况下最快速调节就好,程序里面的没有什么问题了
最后发资料包:
哦对了,如果要测试的话需要把STM8S103F的OptionalByte修改下,OptionalByte掌控IO口的功能复用,具体的操作如下:
在STVD中点Tools菜单中的Programmer,然后按如下设置
再去Memory Areas选项卡,把Memory Area下面的选择框选成PROGRAM MEMORY,再点Add把Debug文件夹中的proj.s19文件装进来,最后去Program页面点Start,如果没看到红字,就完成了!
最后发福利(雾