登录|立即注册|使用QQ帐号登录
论坛 > 51单片机
发帖|
看12374|回18|收藏
楼主 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. }


沙发 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
板凳 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黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版