看論壇上有人用EG8010和TDS2285做逆變器,小弟現在再調試一款STM8S003的小板,感覺資源也夠,只要有PWM和ADC應該就差不多,試著想自己編一個程序試試
該程序主要完成STM TIM1的1,2通道互補輸出,20K的載波,50hz的基波
#include "IOSTM8S103K3.h" #include "math.h" #includeunsigned char pwm_duty[100]; #define LED PC_ODR_ODR4 #define IN PD_IDR_IDR3 unsigned char t,v; unsigned char a,i,j,count; unsigned long k,sum,l; void math(void) { unsigned char i; for(i=0; i<100; i++) { //if(j<= 50) pwm_duty[i]=(unsigned char)(0+(float)254*sin(2*3.1415926*(float)i*0.2/(float)20)); //if(j> 50) pwm_duty[i]=(unsigned char)(254-(float)254*sin(2*3.1415926*(float)i*0.2/(float)20)); pwm_duty[i]=(unsigned char)(127+(float)127*sin(2*3.1415926*(float)i*0.2/(float)20)); } } void delay_ms(unsigned int ms) { unsigned char i; while(ms!=0) { for(i=0;i<250;i++) {} for(i=0;i<75;i++) {} ms--; } } void delay_us(unsigned int us) { unsigned char j; while(us!=0) { for(j=0;j<250;j++) {} us--; } } void Init_Timer4(void) { asm("sim"); TIM4_CR1=0x01;//使能計數器 TIM4_IER=0x01;//更新中斷使能 TIM4_EGR=0x01; TIM4_CNTR=199;//計數器值 TIM4_ARR=199;//自動重裝的值 TIM4_PSCR=0x04;//分頻值128 asm("rim");//開全局中斷,延時16.32ms } #pragma vector=TIM4_OVR_UIF_vector//0x19 __interrupt void TIM4_OVR_UIF_IRQHandler(void)//對應IAP的中斷地址:0x8060 { //asm("JP 0x9060\n"); TIM4_SR=0x00; if(k>= 100) k=0; TIM1_CCR1L = pwm_duty[k]; TIM1_CCR2L = pwm_duty[k]; k++; //return; } void TIM1_CH1_PWM_INIT(void) { CLK_PCKENR1|=0x80;//開啟定時器1外設時鐘 TIM1_EGR=0x01;//重新初始化TIM1 TIM1_EGR|=0x20;//重新初始化TIM1 TIM1_ARRH=0x00;//設定重裝載值 TIM1_ARRL=255; TIM1_PSCRH=0;//預分頻 TIM1_PSCRL=0x04; TIM1_CR1=0;//邊沿對齊,向上計數 TIM1_CCER1=0x55;//高電平有效 TIM1_CCMR1=0x60;//PWM模式1 TIM1_CCMR2=0x60;//PWM模式1 TIM1_DTR=0x04; TIM1_CCR1H=0;//占空比 TIM1_CCR1L=254; TIM1_CCR2H=0;//占空比 TIM1_CCR2L=254; TIM1_CR1|=0x01;//向上計數,無緩存,使能 TIM1_BKR=0x80;//開啟剎車 } void TIM2_CH1_PWM_INIT(void) { TIM2_CCMR1 = TIM2_CCMR1 | 0x70;// Output mode PWM2. TIM2_CCMR3 = TIM2_CCMR3 | 0x70;// Output mode PWM2. // 通道2 被設置成比較輸出方式 // OC2M = 111,為PWM 模式2, // 向上計數時,若計數器小于比較值,為無效電平 // 即當計數器在0 到比較值時,輸出為1,否則為0 TIM2_CCER1 = TIM2_CCER1 | 0x03;// CC polarity low,enable PWM output */ TIM2_CCER2 = TIM2_CCER2 | 0x03; // CC2P = 1,低電平為有效電平 // CC2E = 1,開啟輸出引腳 //初始化自動裝載寄存器,決定PWM 方波的頻率,Fpwm=4000000/256=15625HZ TIM2_ARRH = 0; TIM2_ARRL = 0xFF; //初始化比較寄存器,決定PWM 方波的占空比 TIM2_CCR1H = 0; TIM2_CCR1L = 0; TIM2_CCR3H = 0; TIM2_CCR3L = 0; // 初始化時鐘分頻器為2,即計數器的時鐘頻率為Fmaster=8MHZ TIM2_PSCR = 1; // 啟動計數 TIM2_CR1 = TIM2_CR1 | 0x01; } void main( void ) { CLK_CKDIVR=0x00; math(); PA_DDR|=0x08; PA_CR1|=0x08; PA_CR2|=0x00; PA_ODR|=0x08; PC_DDR|=0x58; PC_CR1|=0x58; PC_CR2|=0x00; // PC_ODR|=0x58; PD_DDR|=0x10; PD_CR1|=0x10; PD_CR2|=0x00; Init_Timer4(); TIM1_CH1_PWM_INIT(); // TIM2_CH1_PWM_INIT(); TIM2_CCR1L = 128; TIM2_CCR3L = 0; TIM1_CCR1L=128; TIM1_CCR2L=128; while(1) { } }