数码之家

 找回密码
 立即注册
搜索
查看: 310|回复: 3

[C51] 小白学51单片机,STC8H PWMA PWMB输出

[复制链接]
发表于 2024-3-25 15:16:57 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
PWMA可以输出4组互补的信号 或者4路单独的信号,不能是同一组,PWMB可以输出4路单独的信号
可以设定频率及每一路的占空比(如果每一路要不同的频率不同的占空比怎么办?)
02a68946d83c401eb9a7ca314cc84086.mp4 (2.1 MB, 下载次数: 6)

打赏

参与人数 1家元 +60 收起 理由
家睦 + 60

查看全部打赏

 楼主| 发表于 2024-3-25 15:18:54 | 显示全部楼层
本帖最后由 hellozwt 于 2024-3-26 09:44 编辑

f630985400e44b76b5a2de21d1f4bd7.jpg
代码如下:
PWMA输出4路单独的信号
  1. #include <stc8h.h>

  2. void pwm_init()
  3. {
  4.          PWMA_PSCR=0x5dc0;        //频率 24000000/(24000*1000)=1Hz
  5.         PWMA_DTR= 0x00;        //
  6.         PWMA_ARR=1000;         //自动重装寄存器,控制PWM周期
  7.         PWMA_CCER1 = 0x00; //先清零 CC2NP CC2NE CC2P CC2E CC1NP CC1NE CC1P CC1E
  8.         PWMA_CCER2 = 0x00; //关通道        CC4NP CC4NE CC4P CC4E CC3NP CC3NE CC3P CC3E
  9.         PWMA_SR1=0x00;
  10.         PWMA_SR2=0x00;
  11.         PWMA_ENO = 0x00;  //使能输出
  12.         PWMA_PS = 0x00;  //高级 PWM 通道输出脚选择
  13.         PWMA_IER=0x00;
  14. //P1.1
  15.     PWMA_CCMR1 = 0x68; //通道模式,PWM模式1预装载
  16.         PWMA_CCR1=200;        //比较值,控制占空比,高电平有效
  17.     PWMA_CCER1 |= 0x05; //开启比较输出,高电平有效
  18.         PWMA_ENO |= 0x02;  //使能输出
  19.         PWMA_PS |= 0x00;  //高级 PWM 通道输出脚选择
  20. //P1.3
  21.         PWMA_CCMR2 = 0x68; //
  22.         PWMA_CCR2=400;
  23.     PWMA_CCER1 |= 0x50; //
  24.         PWMA_ENO |= 0x08;  //
  25.         PWMA_PS |= 0x00;  //
  26. //P1.5
  27.         PWMA_CCMR3 = 0x68; //
  28.         PWMA_CCR3=600;
  29.     PWMA_CCER2 |= 0x05; //
  30.         PWMA_ENO |= 0x20;  //
  31.         PWMA_PS |= 0x00;  //
  32. //P1.7
  33.         PWMA_CCMR4 = 0x68; //
  34.         PWMA_CCR4=800;
  35.     PWMA_CCER2 |= 0x50; //
  36.         PWMA_ENO |= 0x80;  //
  37.         PWMA_PS |= 0x00;  //

  38.         PWMA_EGR = 0x01;        //产生一次更新事件
  39.     PWMA_BKR = 0x80; //使能主输出
  40.     PWMA_CR1 |= 0x01; //开始计时
  41. }
  42. // PWMA_ENO
  43. // 0x01 p1.0 p2.0 p6.0
  44. // 0x02 P1.1 P2.1 P6.1
  45. // 0X04 P1.2 P2.2 P6.2
  46. // 0X08 P1.3 P2.3 P6.3
  47. // 0X10 P1.4 P2.4 P6.4
  48. // 0X20 P1.5 P2.5 P6.5
  49. // 0X40 P1.6 P2.6 P6.6 P3.4
  50. // 0X80 P1.7 P2.7 P6.7 P3.3
  51. // PWMA_PS
  52. // 0x00        p1.0 p1.1 p1.2 p1.3 p1.4 p1.5 p1.6 p1.7
  53. // 0x01 p2.0 p2.1        
  54. // 0x02 p6.0 p6.1        
  55. // 0x04 p2.2 p2.3        
  56. // 0x08 p6.2 p6.3        
  57. // 0x10 p2.4 p2.5        
  58. // 0x20 p6.4 p6.5
  59. // 0x40 p2.6 p2.7
  60. // 0x80 p6.6 p6.7
  61. // 0xc0 p3.4 p3.3
复制代码

PWMB输出4路单独的信号
  1. #include <stc8h.h>

  2. void pwm_init()
  3. {
  4.          PWMB_PSCR=0x5dc0;        //频率 24000000/(24000*1000)=1Hz
  5.         PWMB_ARR=1000;         //自动重装寄存器,控制PWM周期
  6.         PWMB_CCER1 = 0x00; //先清零 CC2NP CC2NE CC2P CC2E CC1NP CC1NE CC1P CC1E
  7.         PWMB_CCER2 = 0x00; //关通道        CC4NP CC4NE CC4P CC4E CC3NP CC3NE CC3P CC3E
  8.         PWMB_SR1=0x00;
  9.         PWMB_SR2=0x00;
  10.         PWMB_ENO = 0x00;  //使能输出
  11.         PWMB_PS = 0x00;  //高级 PWM 通道输出脚选择
  12.         PWMB_IER=0x00;
  13. //P2.0
  14.     PWMB_CCMR1 = 0x68; //通道模式 OC1M 110 PWM模式
  15.         PWMB_CCR5=200;
  16.     PWMB_CCER1 |= 0x01; //配置通道输出使能和极性
  17.         PWMB_ENO |= 0x01;  //使能输出
  18.         PWMB_PS |= 0x00;  //高级 PWM 通道输出脚选择
  19. //p2.1
  20.         PWMB_CCMR2 = 0x68; //通道模式 OC1M 110 PWM模式
  21.         PWMB_CCR6=400;
  22.     PWMB_CCER1 |= 0x10; //配置通道输出使能和极性
  23.         PWMB_ENO |= 0x04;  //使能输出
  24.         PWMB_PS |= 0x00;  //高级 PWM 通道输出脚选择
  25. //p2.2
  26.         PWMB_CCMR3 = 0x68; //通道模式 OC1M 110 PWM模式
  27.         PWMB_CCR7=600;
  28.     PWMB_CCER2 |= 0x01; //配置通道输出使能和极性
  29.         PWMB_ENO |= 0x10;  //使能输出
  30.         PWMB_PS |= 0x00;  //高级 PWM 通道输出脚选择
  31. //p2.3
  32.         PWMB_CCMR4 = 0x68; //通道模式 OC1M 110 PWM模式
  33.         PWMB_CCR8=800;
  34.     PWMB_CCER2 |= 0x10; //配置通道输出使能和极性
  35.         PWMB_ENO |= 0x40;  //使能输出
  36.         PWMB_PS |= 0x00;  //高级 PWM 通道输出脚选择

  37.         PWMB_EGR = 0x01;        //产生一次更新事件
  38.     PWMB_BKR = 0x80; //使能主输出
  39.     PWMB_CR1 |= 0x01; //开始计时
  40. }

  41. // PWMB_ENO
  42. // 0x01 p2.0 p1.7 p0.0 P7.4
  43. // 0X04 P2.1 P5.4 P0.0 P7.5
  44. // 0X10 P2.2 P3.3 P0.2 P7.6
  45. // 0X40 P2.3 P3.4 P0.3 P7.7
  46. // PWMB_PS
  47. // 0x00        p2.0 p2.1 p2.2 p2.3
  48. // 0x01 p1.7         
  49. // 0x02 p0.0         
  50. // 0x03 p7.4        
  51. // 0x04 p5.4        
  52. // 0x08 p0.1
  53. // 0x0c P7.5        
  54. // 0x10 p3.3
  55. // 0x20 p0.2
  56. // 0x30 p7.6
  57. // 0x40 p3.4
  58. // 0x80 p0.3
  59. // 0xc0 p7.7
复制代码

占空比是高电平有效,所以越小代表高电平越少,低电平越多,灯亮的时间就越长(因为灯是低电平亮)




回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-25 17:15:03 | 显示全部楼层
我在STC论坛上看到这样的描述:

第一组 PWM/PWMA 的时钟频率可以是系统时钟经过寄存器 PWMA_PSCRH 和 PWMA_PSCRL 进
行分频后的时钟,分频值可以是 1~65535 之间的任意值。第二组 PWM/PWMB 的时钟频率可以是系统时
钟经过寄存器 PWMB_PSCRH 和 PWMB_PSCRL 进行分频后的时钟,分频值可以是 1~65535 之间的任意
值。两组 PWM 的时钟频率可分别独立设置。

看来要实现2路不同频率不同占空比的信号要开PWMA和PWMB两组了
回复 支持 反对

使用道具 举报

发表于 2024-3-27 08:29:41 | 显示全部楼层
加油!一起学习
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-28 17:30 , Processed in 0.312001 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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