專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

pic單片機(jī)CCP脈沖(PWM)輸出

作者:佚名   來源:不詳   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月31日   【字體:

#include  <pic.h>
//該程序用于使CCP1模塊產(chǎn)生分辨率為10位的PWM波形,占空比為50%,根據(jù)PWM_WIDE計(jì)算頻率。proteus仿真通過
//CCP1(CCP2相同設(shè)置)模塊的PWM工作方式初始化子程序(中斷為什么不行呢?)
#define CCP1
#define PWM_WIDE   0x7F
#define PWM_TOTAL PWM_WIDE<<1

 

void CCPINIT()
{
#ifdef CCP1
 CCPR1L = PWM_WIDE;
 CCP1CON = 0X3C;      //設(shè)置CCP1模塊為PWM工作方式,且其工作
                      //循環(huán)的低2位為11,高8位為01111111=7F
 TRISC  &= 0XFB;      //設(shè)置CCP1引腳為輸出方式
#else
 CCPR2L = PWM_WIDE;
 CCP2CON = 0X3C;   // CCP2
 TRISC  &= 0XFD;      //設(shè)置CCP2引腳為輸出方式
#endif
 PR2=PWM_TOTAL;       //設(shè)置PWM的工作周期
 INTCON &= 0X00;      //禁止總中斷和外圍中斷 
}
void DelayMs(unsigned int ms)
{
 unsigned char i;
 while(--ms)
 {
  for(i=110;i>0;--i);
 }
}
//主程序
main()
{
 TRISD = 0xff;
    CCPINIT();        //CCP1模塊的PWM工作方式初始化
 T2CON |= 0X04;    //打開TMR2,且使其前分頻為0,
                      //同時(shí)開始輸出PWM波形
 while(1)          //系統(tǒng)開始輸出PWM波形。如果系統(tǒng)是多任務(wù)的,則可以在此執(zhí)行其它任務(wù),而不會(huì)影響PWM波形的產(chǎn)生
 {
  if(RD0 == 1)
  {
   DelayMs(5);
   if(RD0 == 1)//設(shè)置條件停止發(fā)送脈沖,中止(步進(jìn)電機(jī)等)設(shè)備
   {
    T2CON &= 0xFB;
   #ifdef CCP1
    CCPR1L=0;
   #else
    CCPR2L=0;
   #endif
    PR2=0;
    while(!RD0);
   }
   else
   {
    T2CON |=0X04;
   #ifdef CCP1
    CCPR1L = PWM_WIDE;
   #else
    CCPR2L = PWM_WIDE;
   #endif
    PR2 = PWM_TOTAL;
   }  
  } 
 }
}

關(guān)閉窗口