linlh 发表于 2012-4-20 14:31:03

STC12LE5616AD单片机怎么用PCA实现不了16位占空比可调的PWM啊?

本帖最后由 linlh 于 2012-4-20 14:32 编辑

问题:使用的是STC12LE5616AD单片机,想用其PCA实现占空比可调,周期固定的PWM功能来实现DAC,因为其PCA自带的PWM只有8位,满足不了我的要求,我想实现16位(12位也可以)的PWM,使用了其中的高速输出模式,但是发现占空比无法在运行中改变,只能是在初始化时修改占空比,不知道怎么回事,大家有没有办法啊,我不想用定时器来实现,定时器太珍贵,以后还有别的用途。难道PCA就实现不了占空比可调的16位PWM功能吗?贴上我的程序如下:
/************************************头文件*******************************************/
#include <STC12C5616AD.H>
#include <stdio.h>               
#include <string.h>
#include <intrins.h>

/************************************宏定义*******************************************/
#define uchar unsigned char
#define uintunsigned int
#define ulong unsigned long
#define PWM_START0x4000
unsigned   PWM=PWM_START;
sbit PCA0_Pin=P3^7;                       //PCA0                          
sbit UpKey=P3^5;                     // 增加占空比按键
sbit DownKey=P0^1;               // 减少占空比按键
sbit POWER_LED =P2^7;            //运行指示灯

uchar PWM_Lower;
uchar PWM_Higher;
uint PWM_Temp;

/********************************延时子程序*******************************************/
//说明:
void delayms(uint ms)       
{                               
        uint i;
        while(ms)
        {
                for(i=25;i>0;i--)
                {}
                ms--;
        }
}

/********************************端口初始化子程序************************************/
//说明:
void PORT_Init (void)
{
P3M0=0x00;//推挽
P3M1=0x80;
}


//***********************************PCA0初始化子程序*********************************/
//说明:PCA0工作在16位高速输出方式,实现16位PWM
void PCA0_Init (void)
{
CMOD=0x81;                                                        //PCA0的时钟源为Fosc/12;空闲模式下停止工作;禁止PCA计数器溢出中断
CCON=0x00;                                                        //清PCA计数器溢出中断标志位CF=0;清PCA0中断标志位CCF0=0;停止PCA0计数CR=0
CL=0;                                                                                //清PCA计数器
CH=0;
   
CCAP0L=(0xff & PWM);
CCAP0H=(0xff & (PWM>>8));
      
CCAPM0=0x4D;                                                //工作于高速输出方式;ECCF0=1
CR=1;
}


/*******************************中断初始化子程序*********************************/
//说明:使能PCA0
void Interrupt_Init(void)
{
    CR=0;
    EPCA_LVD=1;                       
    EA = 1;                                                                                 //允许全局中断                                          
}

/******************************按键扫描子程序******************************/
//说明:扫描键盘获取键值。
void KeyScan(void)
{
if(UpKey==0)//“+”键
{
       delayms(10);
      if(UpKey==1)
      {
         if(PWM_Temp<65535)
         {
             PWM_Temp++;
         }      
      }

      while(UpKey==0)
      {
          if(PWM_Temp<65535)
         {
             PWM_Temp++;
         }
         delayms(5);
   }
   }

   if(DownKey==0)//“-”键
   {
       delayms(10);
       if(DownKey==1)
       {
          if(PWM_Temp>0)
         {
             PWM_Temp--;
         }   
      }
      while(DownKey==0)
      {
         if(PWM_Temp>0)
      {
            PWM_Temp--;
      }
      delayms(5);
      }
}
}


/***************************************PCA中断子程序************************************/
//说明:
void PCA(void) interrupt 6
{
    EA=0;
    CR=0;       
if(CCF0==1)
{       
        if(PCA0_Pin==1)
        {
          CCAP0L=(0xff & PWM_Temp);//改变占空比
                  CCAP0H=(0xff & (PWM_Temp>>8));
              }
        else
        {
          CCAP0L=0;
           CCAP0H=0;
        }
       
        CCF0=0;
}
else if(CCF1)
{
        CCF1=0;
}
else if(CCF2)
{
        CCF2=0;
}
else if(CCF3)
{
        CCF3=0;
}
else if(CF)
{
        CF=0;
}
CR=1;
EA=1;
}



void main(void)
{
   EA=0;
    PCA0_Pin=1;
    POWER_LED=0;       
    PORT_Init();//端口初始化
   Interrupt_Init();//中断初始化
   PCA0_Init();
       
    while(1)
   {
      KeyScan();//扫描按键
    }
}

BXAK 发表于 2012-4-20 18:04:09

可以是可以,但无法做到高频PWM,实现DAC也就没了意义
页: [1]
查看完整版本: STC12LE5616AD单片机怎么用PCA实现不了16位占空比可调的PWM啊?