STC12C5410AD 能输出16位PWM吗?
看了一些论坛别人说可以,但自己亲测总是不成功--------------------------------------------------------------------
#include <STC12C5412AD.H>
#define uchar unsigned char
#define uint unsigned int
sbit PWM_OUT=P3^5;//PWM输出引脚
uint PWM=2000;
/*------------------------------------------------------------------------------
** Function Name: pwm_init()
** Description : PWM脉冲输出初始化
** Import : NONE
** Export : NONE
-------------------------------------------------------------------------------*/
void pwm_init(void)
{
CMOD = 0x0a; // 时钟源选择
CCON = 0x00;
CH = 0x00; // 计数器
CL = 0x00;
CCAP1L = (0xff &PWM); // 模块初值
CCAP1H = (0xff & (PWM >> 8));
CCAPM1 = 0x4d; // 设置为高速模式,允许中断
//IPH = 0x80; // PCA为最高优先级
IP = 0x80;
CR = 1;
EA = 1;
}
/*-------------------------------------------------------------------------------------------------
** Function Name: PCATask()
** Description : pca isr
** Import : NONE
** Export : NONE
-------------------------------------------------------------------------------------------------*/
void PCATask(void) interrupt 6
{
if (CCF1)
{
CCF1= 0;
if (PWM_OUT)
{
CCAP1L= (0xff &PWM);
CCAP1H= (0xff & (PWM >> 8)); //PWM是16位的PWM占空比数据。
}
else
{
CCAP1L= 0;
CCAP1H= 0;
}
}
else if (CF) CF = 0;
else if (CCF0) CCF0 = 0;
}
void main()
{
pwm_init();
PWM=20;
//PWM_OUT=1;
while(1)
{
;
}
} mark 我记得数据手册上面写的是8位的PWM 虽然有4路,但是周期设置很麻烦,51的核用起来很麻烦,基本上叫做很挫,价格现在也没有什么吸引力了,还不如去用AVR 没有16位硬件PWM,只能通过软件方式模拟出16位PWM。 回复【2楼】416446891 俊昌
-----------------------------------------------------------------------
不能这么说,只是51中的STC用起来很挫,不是所有的51都很挫,STC在价格上比起AVR来是好多了,AVR硬件本身就支持16位的PWM,STC硬件只支持8位。我有次手头上只有一块STC买的烧写器,插了一片5410,把四组PWM输出后做积分再做加法电路,做成了一个12位的DAC,我想这是STC硬件能做到的最高级别了吧。 上面最后一句说错了,是做成了一个10位的DAC,不是12位。 可以用PCA的高速输出模式做软件16位PWM,只是需要每个周期进入一次中断。 avr硬件支持16位pwm? 我的本意正是用PCA的高速输出模式做软件16位PWM,上面的程序为何行不通? stc 的 pwm 就是8位的,只能用两个输出做9位的,4个输出做10位的,外面用电路来做平均处理了
页:
[1]