找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9769|回复: 18
打印 上一主题 下一主题
收起左侧

关于STC8A系列单片机10位PWM,改变占空比操作

  [复制链接]
跳转到指定楼层
楼主
ID:326785 发表于 2018-12-10 11:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 黄进盛 于 2018-12-10 13:58 编辑
  1. STC8系列单片机10位占空比调节程序演示:(程序片段)
复制代码
  1. #include <pwm.h>

  2. unsigned int Set_PWM;//10位占空比预存变量0-1023

  3. void PWM_Init(void)
  4. {
  5.   CCON = 0x00;
  6.   CMOD = 0x08;//PCA时钟为系统时钟
  7.   CL = 0x00;  //PCA计数器初始值低8位
  8.   CH = 0x00;  //PCA计数器初始值高8位
  9.   CCAPM0 = 0x42; //PCA模块0为PWM工作模式
  10.   PCA_PWM0 = 0xc0;//PCA模块0输出10位PWM
  11.   CCAP0L = 0x00;
  12.   CCAP0H = 0x00;//PCA模块用在PWM 模式中时,用来控制输出的占空比。
  13.   CR = 1; //启动PCA计时器
  14. }
  15. void PWM_Output()
  16. {
  17.         PCA_PWM0=0x30&(Set_PWM>>2);//高两位XCCAPnH[1:0]
  18.   CCAP0H =Set_PWM;//低8位CCAPnH[7:0]
  19. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:399820 发表于 2019-1-23 14:53 | 只看该作者
这段不对,PCA_PWM0=0x30&(Set_PWM>>2);//高两位XCCAPnH[1:0] ,应该是PCA_PWM0=0x30&(Set_PWM>>4);,右移4位才能将Set_PWM的第8、9位和0x30相与,才能取出Set_PWM的第8、9位赋值给PCA_PWM0,例如:Set_PWM=0b 10 0000 1111,Set_PWM>>4后等于0b 00 0010 0000 ,然后和0x30相与:0b 00 0010 0000 & 0b 0011 0000 (0x30) =0x32

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:399820 发表于 2019-1-23 14:56 | 只看该作者
这段不对,PCA_PWM0=0x30&(Set_PWM>>2);//高两位XCCAPnH[1:0]
回复

使用道具 举报

地板
ID:326785 发表于 2019-2-18 11:28 | 只看该作者
多谢指点,但Set_PWM>>4后等于0b 00 0010 0000 ,然后和0x30相与:0b 00 0010 0000 & 0b 0011 0000 (0x30) =0x32,是等于0x20吧。
回复

使用道具 举报

5#
ID:226798 发表于 2019-9-5 16:21 来自手机 | 只看该作者
楼主我想问问你的问题解决了吗?我测试10位PWM占空比,但是9位与10位就是写不对,用或操作看到寄存器的值居然是与操作
回复

使用道具 举报

6#
ID:432495 发表于 2019-12-6 08:40 | 只看该作者

#include <pwm.h>

unsigned int Set_PWM;//10位占空比预存变量0-1023

void PWM_Init(void)
{
  CCON = 0x00;
  CMOD = 0x08;//PCA时钟为系统时钟
  CL = 0x00;  //PCA计数器初始值低8位
  CH = 0x00;  //PCA计数器初始值高8位
  CCAPM0 = 0x42; //PCA模块0为PWM工作模式
  PCA_PWM0 = 0xc0;//PCA模块0输出10位PWM
  CCAP0L = 0x00;
  CCAP0H = 0x00;//PCA模块用在PWM 模式中时,用来控制输出的占空比。
  CR = 1; //启动PCA计时器
}
void PWM_Output()
{
        PCA_PWM0=0x30&(Set_PWM>>2);//高两位XCCAPnH[1:0]
  CCAP0H =Set_PWM;//低8位CCAPnH[7:0]
}
回复

使用道具 举报

7#
ID:432495 发表于 2019-12-6 08:41 | 只看该作者

void PWM_Output()
{
        PCA_PWM0=0x30&(Set_PWM>>2);//高两位XCCAPnH[1:0]
  CCAP0H =Set_PWM;//低8位CCAPnH[7:0]
}
回复

使用道具 举报

8#
ID:432495 发表于 2019-12-6 09:01 | 只看该作者
PWM_Output()做如下修改
void PWM_Output()
{
      //比较值更新
        PCA_PWM0|=0x0C&(Set_PWM>>6);//高两位XCCAPnL[1:0],比较值高2位
        CCAP0L =Set_PWM;//低8位CCAPnL[7:0], 比较值低8位
     //重载值更新
       PCA_PWM0|=0x30&(Set_PWM>>4);//高两位XCCAPnH[1:0],重载值高2位
        CCAP0H =Set_PWM;//低8位CCAPnH[7:0],重载值低8位
}

我也是反复调试才发现,比较值和重载值必须这样同步跟新才行,只有比较值同步更新重载进去的重载值才有比较的数据,实际输出占空比=(400H-Set_PWM)/400H.
回复

使用道具 举报

9#
ID:230975 发表于 2019-12-6 10:23 | 只看该作者
为什么不直接使用STC8的硬件PWM功能呢。
回复

使用道具 举报

10#
ID:301826 发表于 2019-12-18 10:46 | 只看该作者

PWM_Output()做如下修改
void PWM_Output()
{
      //比较值更新
        PCA_PWM0|=0x0C&(Set_PWM>>6);//高两位XCCAPnL[1:0],比较值高2位
        CCAP0L =Set_PWM;//低8位CCAPnL[7:0], 比较值低8位
     //重载值更新
       PCA_PWM0|=0x30&(Set_PWM>>4);//高两位XCCAPnH[1:0],重载值高2位
        CCAP0H =Set_PWM;//低8位CCAPnH[7:0],重载值低8位
}

我也是反复调试才发现,比较值和重载值必须这样同步跟新才行,只有比较值同步更新重载进去的重载值才有比较的数据,实际输出占空比=(400H-Set_PWM)/400H.
回复

使用道具 举报

11#
ID:301826 发表于 2019-12-18 10:47 | 只看该作者
这样操作还是有问题
回复

使用道具 举报

12#
ID:385637 发表于 2019-12-18 11:20 | 只看该作者
看网上很多人说STC8系列还没STC15系列稳定,抗干扰更差是真的吗?
回复

使用道具 举报

13#
ID:316880 发表于 2020-3-5 11:59 | 只看该作者
     //重载值更新
       PCA_PWM0|=0x30&(Set_PWM>>4);//高两位XCCAPnH[1:0],重载值高2位
        CCAP0H =Set_PWM;//低8位CCAPnH[7:0],重载值低8位

   Set_PWM = 520;这样赋值可以直接得到一个固定的PWM,但是Set_PWM ++;限制 if(Set_PWM >=1023) Set_PWM =0;这样就不能现实0-5V,大于1023以后只能0-1.8v不知道是不是溢出赋值不对,不知道怎么才正确,10位的不会用,还是8位一个字节没有问题,如果哪个知道10位PWM,怎么0-1023,赋值的大神,希望留下答案。
回复

使用道具 举报

14#
ID:548519 发表于 2020-3-13 18:28 | 只看该作者
PCA_PWM0=0x30&(Set_PWM>>4)|0xc0;//高两位XCCAPnH[1:0]  
 CCAP0H =Set_PWM;//低8位CCAPnH[7:0]

这样可以实现0~1023更新占空比
回复

使用道具 举报

15#
ID:226798 发表于 2020-3-14 05:14 来自手机 | 只看该作者
我遇到过,经验是将寄存器值直接赋值
回复

使用道具 举报

16#
ID:58799 发表于 2020-8-2 23:07 | 只看该作者
qj0200 发表于 2020-3-13 18:28
PCA_PWM0=0x30&(Set_PWM>>4)|0xc0;//高两位XCCAPnH[1:0]  
 CCAP0H =Set_PWM;//低8位CCAPnH[7:0 ...

大神 你这个  没问题了
回复

使用道具 举报

17#
ID:294397 发表于 2021-12-9 09:56 | 只看该作者
第10楼的 PCA_PWM0 不能 PCA_PWM0 |=xxxxx;   比较值 和 重载值 都不能,
不然次数多了就值不再更新了,可以 printf (PCA_PWM0) 值的变化。   
回复

使用道具 举报

18#
ID:491923 发表于 2021-12-15 16:02 | 只看该作者
qj0200 发表于 2020-3-13 18:28
PCA_PWM0=0x30&(Set_PWM>>4)|0xc0;//高两位XCCAPnH[1:0]  
 CCAP0H =Set_PWM;//低8位CCAPnH[7:0 ...

大神!确实是大神!!!
回复

使用道具 举报

19#
ID:286816 发表于 2022-3-22 11:41 | 只看该作者
哪一个引脚输出呀,是那一句控制的,小白看不懂
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表