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();//扫描按键
}
} 可以是可以,但无法做到高频PWM,实现DAC也就没了意义
页:
[1]