[STC单片机] 关于STC15系列单片机8位PWM模式的问题

[复制链接]
3276|14
 楼主| 令界剑 发表于 2017-5-9 09:02 | 显示全部楼层 |阅读模式
STC单片机的CCAPnH这个寄存器能不能读取它的值?还有CCAP2H = 255*(spd)/100;      //将需要设置的占空比赋值到PCA模块2捕获寄存器HIGH中

上面代码中,如果是255为系数,PWM输出不可调且是一个很小的输出,而改为256时就可以正常调节PWM输出,有大神知道怎么回事吗?

 楼主| 令界剑 发表于 2017-5-9 10:17 | 显示全部楼层
libre01 发表于 2017-5-9 10:59 | 显示全部楼层
CCAP2H 8位最大就是255,256-255/256=0.4%的占空比输出,所以要把EPC0H置1;才能完全关闭PWM
 楼主| 令界剑 发表于 2017-5-9 11:17 | 显示全部楼层
libre01 发表于 2017-5-9 10:59
CCAP2H 8位最大就是255,256-255/256=0.4%的占空比输出,所以要把EPC0H置1;才能完全关闭PWM ...

那为何它的占空比不可调呢,我改变spd的值占空比没有任何改变。
libre01 发表于 2017-5-9 11:43 | 显示全部楼层
你把PCA这段代码发出来看下
 楼主| 令界剑 发表于 2017-5-9 11:56 | 显示全部楼层
libre01 发表于 2017-5-9 11:43
你把PCA这段代码发出来看下

void PWM_Init(void)
{
        AUXR1 = (AUXR1 &~ (3<<4)) | (0<<4);        //选择默认IO口P12_P11_P10_P37
        P3M1 &= 0x7F;P3M0 &=0x7F;        //P3.7口设置为准双向
        CCON = 0;                //初始化PCA控制寄存器
                                        //PCA定时器停止
                                        //清除CF标志
                                        //清除模块中断标志
        CL = 0;                        //复位PCA寄存器
        CH = 0;
        CMOD = 0x0A;        //设置PCA时钟源SYSclk/4,ECF=0禁止PCA计数器溢出中断,PWM频率=PCA时钟输入源/256,这里约=11.7K
        PCA_PWM2 = 0x00;//PCA模块2工作于8位PWM
        CCAPM2 = 0x42;        //PCA模块2为8位PWM模式
        CR = 1;
}

void MotoSpeed_Setting(unsigned char spd)
{
  CCAP2H = 255*(spd)/100;      //将需要设置的占空比赋值到PCA模块2捕获寄存器HIGH中
}
libre01 发表于 2017-5-9 15:04 | 显示全部楼层
令界剑 发表于 2017-5-9 11:56
void PWM_Init(void)
{
        AUXR1 = (AUXR1 &~ (3

你把口设置成推挽输出,再试下
 楼主| 令界剑 发表于 2017-5-9 15:41 | 显示全部楼层
libre01 发表于 2017-5-9 15:04
你把口设置成推挽输出,再试下

跟IO模式没有关系
 楼主| 令界剑 发表于 2017-5-9 19:07 | 显示全部楼层
是不是我的表达式是错的
libre01 发表于 2017-5-10 08:57 | 显示全部楼层
令界剑 发表于 2017-5-9 19:07
是不是我的表达式是错的

运算式 加个强制转换成uchar
 楼主| 令界剑 发表于 2017-5-10 11:17 | 显示全部楼层
libre01 发表于 2017-5-10 08:57
运算式 加个强制转换成uchar

数据类型溢出了,255和256不是相同的数据类型,所以造成了计算出的值不一样,希望对你有帮助
hanlie2345678 发表于 2017-5-10 22:07 | 显示全部楼层
不要搞得这么繁烦呀QQ:459023641
coody 发表于 2017-5-10 22:24 | 显示全部楼层
计算溢出了,编译器都当8位来计算,溢出的丢弃,所以你就出错了,还好,没做直接说是STC的问题,呵呵(网上一般都是说STC的问题)。

if(spd > 100)   spd = 100;   //限制spd值防止溢出
CCAP2H = (unsigned char)((255*(unsigned int)spd)/100);
 楼主| 令界剑 发表于 2017-5-11 15:01 | 显示全部楼层
coody 发表于 2017-5-10 22:24
计算溢出了,编译器都当8位来计算,溢出的丢弃,所以你就出错了,还好,没做直接说是STC的问题,呵呵(网上 ...

是溢出所致,这种一般不能首先怀疑单片机,毕竟单片机已经被人用了这么多年了,已经很成熟了。
渔夫的烟斗 发表于 2017-5-11 22:30 | 显示全部楼层
所以楼主的问题解决了吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:多学多问多做

27

主题

137

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部