打印
[STC单片机]

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

[复制链接]
2501|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
令界剑|  楼主 | 2017-5-9 09:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
令界剑|  楼主 | 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的值占空比没有任何改变。

使用特权

评论回复
5
libre01| | 2017-5-9 11:43 | 只看该作者
你把PCA这段代码发出来看下

使用特权

评论回复
6
令界剑|  楼主 | 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中
}

使用特权

评论回复
7
libre01| | 2017-5-9 15:04 | 只看该作者
令界剑 发表于 2017-5-9 11:56
void PWM_Init(void)
{
        AUXR1 = (AUXR1 &~ (3

你把口设置成推挽输出,再试下

使用特权

评论回复
8
令界剑|  楼主 | 2017-5-9 15:41 | 只看该作者
libre01 发表于 2017-5-9 15:04
你把口设置成推挽输出,再试下

跟IO模式没有关系

使用特权

评论回复
9
令界剑|  楼主 | 2017-5-9 19:07 | 只看该作者
是不是我的表达式是错的

使用特权

评论回复
10
libre01| | 2017-5-10 08:57 | 只看该作者
令界剑 发表于 2017-5-9 19:07
是不是我的表达式是错的

运算式 加个强制转换成uchar

使用特权

评论回复
11
令界剑|  楼主 | 2017-5-10 11:17 | 只看该作者
libre01 发表于 2017-5-10 08:57
运算式 加个强制转换成uchar

数据类型溢出了,255和256不是相同的数据类型,所以造成了计算出的值不一样,希望对你有帮助

使用特权

评论回复
12
hanlie2345678| | 2017-5-10 22:07 | 只看该作者
不要搞得这么繁烦呀QQ:459023641

使用特权

评论回复
13
coody| | 2017-5-10 22:24 | 只看该作者
计算溢出了,编译器都当8位来计算,溢出的丢弃,所以你就出错了,还好,没做直接说是STC的问题,呵呵(网上一般都是说STC的问题)。

if(spd > 100)   spd = 100;   //限制spd值防止溢出
CCAP2H = (unsigned char)((255*(unsigned int)spd)/100);

使用特权

评论回复
14
令界剑|  楼主 | 2017-5-11 15:01 | 只看该作者
coody 发表于 2017-5-10 22:24
计算溢出了,编译器都当8位来计算,溢出的丢弃,所以你就出错了,还好,没做直接说是STC的问题,呵呵(网上 ...

是溢出所致,这种一般不能首先怀疑单片机,毕竟单片机已经被人用了这么多年了,已经很成熟了。

使用特权

评论回复
15
渔夫的烟斗| | 2017-5-11 22:30 | 只看该作者
所以楼主的问题解决了吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:多学多问多做

27

主题

137

帖子

2

粉丝