今天用STM8s試了下調(diào)制SPWM,查表法做的,定時(shí)器1通道2引腳輸出SPWM,又通過(guò)一個(gè)LC濾波,就看到了下面的正弦波
#include "IOSTM8S103K3.h" #include "math.h" #include#define LED PC_ODR_ODR2 unsigned int pwm_duty[100]; unsigned char j=0; /* Phase difference */ unsigned char cnt_pwm=0; void math(void) { unsigned char i; for(i=0; i<100; i++) { pwm_duty[i]=(unsigned int)(127+(float)127*sin(2*3.1415926*(float)i*0.2/(float)20)); } } 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;//使能計(jì)數(shù)器 TIM4_IER=0x01;//更新中斷使能 TIM4_EGR=0x01; TIM4_CNTR=199;//計(jì)數(shù)器值 TIM4_ARR=199;//自動(dòng)重裝的值 TIM4_PSCR=0x02;//分頻值128 asm("rim");//開全局中斷,延時(shí)16.32ms } #pragma vector=TIM4_OVR_UIF_vector//0x19 __interrupt void TIM4_OVR_UIF_IRQHandler(void)//對(duì)應(yīng)IAP的中斷地址:0x8060 { TIM4_SR=0x00; cnt_pwm++; if (cnt_pwm>3) { cnt_pwm=0; /* Sin wave CC1 PB0*/ if(j>= 100) j=0; TIM1_CCR2H = (unsigned char)(pwm_duty[j]>>8); TIM1_CCR2L = (unsigned char)(pwm_duty[j]&0x00ff); j++; } } void TIM1_CH2_PWM_INIT(void) { CLK_PCKENR1|=0x80;//開啟定時(shí)器1外設(shè)時(shí)鐘 TIM1_EGR=0x01;//重新初始化TIM1 TIM1_EGR|=0x60;//重新初始化TIM1 TIM1_ARRH=0x00;//設(shè)定重裝載值 TIM1_ARRL=255; TIM1_PSCRH=0;//預(yù)分頻 TIM1_PSCRL=1; TIM1_CR1=0;//邊沿對(duì)齊,向上計(jì)數(shù) TIM1_CCER1=0x11;//高電平有效 TIM1_CCMR1=0x60;//PWM模式1 TIM1_CCMR2=0x60;//PWM模式1 TIM1_CCR2H=0;//占空比 TIM1_CCR2L=254; TIM1_CCR1H=0;//占空比 TIM1_CCR1L=254; TIM1_CR1|=0x01;//向上計(jì)數(shù),無(wú)緩存,使能 TIM1_BKR=0x80;//開啟剎車 } void main( void ) { /*High speed internal clock prescaler: 1*/ CLK_CKDIVR = 0x00; math(); PC_DDR|=0x04; PC_CR1|=0x04; PC_CR2|=0x00; Init_Timer4(); TIM1_CH2_PWM_INIT(); while(1) { } }