上大學之后忙成了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模式,高電平有效,同時開啟反向的輸出,可以給同步整流的管子用哦wTIM1_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/320
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,然后按如下設置