專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開(kāi)發(fā)工具、應(yīng)用測(cè)試 完善的開(kāi)發(fā)代碼案例庫(kù)分享
從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無(wú)限潛能!
十年單片機(jī)開(kāi)發(fā)方案公司深圳英銳恩分享貢獻(xiàn)一個(gè)我寫(xiě)的SPWM程序(PICC)。
//最近在搞SPWM逆變,貢獻(xiàn)一個(gè)小程序,F(xiàn)YI
//用18F452調(diào)的,只有SPWM波形部分,反饋沒(méi)加進(jìn)來(lái),如果需要改幅度,該R_rate的值就好了,范圍(1~195)
//晶震10M+PLL鎖到40M,RC2輸出SPWM波形,RC0為50HZ方波,作為半橋驅(qū)動(dòng)時(shí)的交越信號(hào)。
void main()
{ asm("NOP");
TRISC=0X00; //設(shè)置I/O口方向
TRISD=0X00; //設(shè)置I/O口方向
PORTC=0X00;
PORTD=0X00;
//=============LCD init======================
// lcd_init();
//=============timer0 init===================
T0CON=0x82; //8分頻 ;0xCx is 8bit timer
TMR0L=0x79;
TMR0H=0XFE;
GIE=0X1; //開(kāi)放全局中斷
TMR0IE=1; //使能timer0 interrupt
//==============PWM init=====================
PR2=124; //設(shè)置PWM頻率20K
CCPR1L=0; //設(shè)置占空比高8位,init時(shí)為0
CCP1CON=0x0F; //CCP select PWM mode
T2CON=0X05; //設(shè)置TIMER2預(yù)分頻比并使能T2
//==============MAIN LOOP====================
while(1)
{ }
}
//===============中斷函數(shù)=============================
void interrupt ISR(void)
{
if((TMR0IF)&&(TMR0IE))
{
TMR0L=0x79;
TMR0H=0XFE;
TMR0IF=0;//清除中斷標(biāo)志
update_duty();//用3.2K的定時(shí)頻率按照正弦規(guī)律改變脈寬,改64次正好為50HZ的調(diào)制正弦波
}
}
//下面這部分摘自另一個(gè)文件,
unsigned char R_sin=0; //這個(gè)變量從0~31變化。
unsigned char R_rate=190;//幅度
void update_duty(void)
{ unsigned int i=0;
if(R_sin==0)
RC0=!RC0; //創(chuàng)造交越信號(hào)
i=((float)(sin_tab[R_sin]))*R_rate/100;
R_sin++;
if(R_sin==32)
R_sin=0;
CCPR1L=i/4; //設(shè)置占空比高8位,init時(shí)為0
CCP1CON=0x0F+(i&3)*16;
}
const unsigned char sin_tab[32]={
0,25,50,74,98,120,142,162,180,
197,212,225,235,244,250,254,
255,254,250,244,235,225,212,
197,180,162,142,120,98,74,50,25};
(文源網(wǎng)絡(luò),侵刪)