找回密码
 立即注册
楼主: vb2002

高级16位pwm慢慢学,有点感觉了

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:408
  • 最近打卡:2025-06-29 00:15:48
已绑定手机

144

主题

1702

回帖

2655

积分

金牌会员

积分
2655
发表于 2024-6-28 13:52:26 | 显示全部楼层
  1. #include <STC8H.H>
  2. sbit LED1=P3^3;
  3. sbit KEY1=P3^2;
  4. #define MAIN_Fosc 11059200UL                //定义主频12MHz,请根据实际使用频率修改(用于delay函数自适应主频)
  5. #define        ON        0
  6. #define        OFF        1
  7. #define PWM_ARR 999
  8. #define PWM_CCR 500
  9. typedef unsigned char u8;                                //unsigned char                                 类型,用u8表示
  10. typedef unsigned int u16;                                //unsigned int                                 类型,用u16表示
  11. typedef unsigned long int u32;        //unsigned long int         类型,用u32表示
  12. void sysini(void);                                                // STC32初始化设置
  13. void Timer0_Init(void);                                // 定时器0初始化       
  14. void delayms(u16 ms);                                        // ms*1毫秒延时函数
  15. void PWMA_Init(void);
  16. //-----------------------
  17. void main(void)
  18. {
  19.         P_SW2    = 0x80;
  20.         sysini();                                                                                // STC8h初始化设置
  21.         Timer0_Init();                                                        // 定时器0初始化
  22.         PWMA_Init();
  23.         EA = 1;                                                                                        // 使能EA总中断
  24.        
  25.        
  26.        
  27.        
  28. //        PWMA_PS  = 0xc0;
  29. //    PWMA_CCER2 = 0x00;                          //写CCMRx前必须先清零CCERx关闭通道
  30. //    PWMA_CCMR1 = 0x68;                          //设置CC1为PWMA输出模式
  31. //    PWMA_CCER2 = 0x40;                          //使能CC1通道
  32. ////    PWMA_CCR1  = 20;                            //设置占空比时间
  33. //    PWMA_CCR2  = 495;                            //设置占空比时间
  34. //    PWMA_ARR   = 500;                             //设置周期时间
  35. //    PWMA_ENO   = 0x80;                            //使能PWM1P端口输出
  36. //    PWMA_BKR   = 0x80;                            //使能主输出
  37. //    PWMA_CR1   = 0x01;                            //开始计时
  38.     while (1);
  39. }
  40. void sysini()
  41. {
  42.         P0M1 = 0xFF;P0M0 = 0x00;P1M1 = 0x00;P1M0 = 0x00;P2M1 = 0x00;P2M0 = 0x00;          P4M1 = 0x00;P4M0 = 0x00;P5M1 = 0x00;P5M0 = 0x00;P6M1 = 0x00;P6M0 = 0x00; P7M1 = 0x00;P7M0 = 0x00;               
  43.         P3M1 = 0x00;P3M0 = 0x00;                       
  44. }
  45. //void Timer0_Isr(void) interrupt 1
  46. //{
  47. //       
  48. //}
  49. void Timer0_Init(void)                                //1毫秒@12.000MHz
  50. {
  51.         AUXR |= 0x80;                                                                //定时器时钟1T模式
  52.         TMOD &= 0xF0;                                                                //设置定时器模式
  53.         TL0 = 0x20;                                                                        //设置定时初始值
  54.         TH0 = 0xD1;                                                                        //设置定时初始值
  55.         TF0 = 0;                                                                                //清除TF0标志
  56.         TR0 = 1;                                                                                //定时器0开始计时
  57.         ET0 = 1;                                                                                //使能定时器0中断
  58. }
  59. //========================================================================
  60. void delayms(u16 ms)                        //延时函数的自定义代码
  61. {
  62.         u16 i;
  63.         do{
  64.                 i = MAIN_Fosc /10000;
  65.                 while(--i);
  66.         }while(--ms);
  67. }
  68. void PWMA_Init(void)
  69. {
  70.                 //1,时钟源选择  
  71.                 //2,时基单元选择
  72.         PWMA_PSCRH = 0;                //1分频  0+1  1分频
  73.         PWMA_PSCRH = 0;       
  74.         PWMA_ARRH = (u8)(PWM_ARR>>8);
  75.         PWMA_ARRL = (u8)(PWM_ARR);
  76.        
  77.         PWMA_CCR1H = (u8)(PWM_CCR>>8);
  78.         PWMA_CCR1L = (u8)(PWM_CCR);       
  79.                 //3,输入输出的引脚配置
  80. PWMA_ENO = 0x00;                //使能PWM4N通道输出
  81. PWMA_ENO |= 0x80;
  82.        
  83. PWMA_PS  = 0x00;                //选择PWM4N  P33引脚输出
  84. //PWMA_PS  |= 0xc0;
  85. PWMA_PS  |= 0xc0;
  86.        
  87.                 //4,输入输出模式设置
  88. PWMA_CCER2 =0x00;
  89. PWMA_CCMR1 =0x68;                //pwm模式1 配置置位输出
  90. PWMA_CCER2 =0x40;                //开启输出比较通道
  91. PWMA_BKR   =0x80;                //使能主输出
  92. PWMA_CR1 |= 0x01;                //启动计数器
  93. }
  94. //void PWMA_Init(void)
  95. //{
  96. //                //1,时钟源选择  
  97. //                //2,时基单元选择
  98. //        PWMA_PSCRH = 0;                //1分频  0+1  1分频
  99. //        PWMA_PSCRH = 0;       
  100. //        PWMA_ARRH = (u8)(PWM_ARR>>8);
  101. //        PWMA_ARRL = (u8)(PWM_ARR);
  102. //       
  103. //        PWMA_CCR1H = (u8)(PWM_CCR>>8);
  104. //        PWMA_CCR1L = (u8)(PWM_CCR);       
  105. //                //3,输入输出的引脚配置
  106. //PWMA_ENO = 0x00;                //使能PWM4N通道输出
  107. //PWMA_ENO |= 0x01;
  108. //       
  109. //PWMA_PS  = 0x00;                //选择PWM4N  P33引脚输出
  110. ////PWMA_PS  |= 0xc0;
  111. //PWMA_PS  |= (2<<0);
  112. //       
  113. //                //4,输入输出模式设置
  114. // PWMA_CCER1 =0x00;
  115. // PWMA_CCMR1 =0x68;                //pwm模式1 配置置位输出
  116. // PWMA_CCER1 =0x01;                //开启输出比较通道
  117. // PWMA_BKR   =0x80;                //使能主输出
  118. //
  119. //PWMA_CR1 |= 0x01;                //启动计数器
  120. //}
复制代码


终于把P33口点亮了.
翻手册,找寄存器.一步一步
接下来就可以去调整任意占空比.

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:408
  • 最近打卡:2025-06-29 00:15:48
已绑定手机

144

主题

1702

回帖

2655

积分

金牌会员

积分
2655
发表于 2024-6-28 13:54:29 | 显示全部楼层
梁*** 发表于 2024-6-28 13:46
但我在各论坛很少看到有人抱怨ARM的PWM难学、难用,他们会花几个月时间来啃明白。 ...

原来要花几个月啊
那估计我要花1年多了

点评

STC的你可以以天就整明白  详情 回复 发表于 2024-6-28 13:56
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-06-28 00:08:16

75

主题

6163

回帖

1万

积分

超级版主

积分
12932
发表于 2024-6-28 13:56:48 | 显示全部楼层
vb2*** 发表于 2024-6-28 13:54
原来要花几个月啊
那估计我要花1年多了

STC的你可以一天就整明白
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:408
  • 最近打卡:2025-06-29 00:15:48
已绑定手机

144

主题

1702

回帖

2655

积分

金牌会员

积分
2655
发表于 2024-6-28 13:58:01 | 显示全部楼层
手册里面 P33  是pwm4n_2   
截图202406281357029690.jpg
管脚说明是 pwm4n_4
截图202406281357431134.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:408
  • 最近打卡:2025-06-29 00:15:48
已绑定手机

144

主题

1702

回帖

2655

积分

金牌会员

积分
2655
发表于 2024-6-28 14:01:13 | 显示全部楼层
PWM4N和PWM4N_2(PWM4N_4) 怎么选择哦.
没找到怎么弄

点评

[attachimg]48902[/attachimg] [attachimg]48903[/attachimg] [attachimg]48904[/attachimg] [attachimg]48905[/attachimg]  详情 回复 发表于 2024-6-28 14:34
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:408
  • 最近打卡:2025-06-29 00:15:48
已绑定手机

144

主题

1702

回帖

2655

积分

金牌会员

积分
2655
发表于 2024-6-28 14:04:28 | 显示全部楼层
神*** 发表于 2024-6-28 13:51
30个小时,全学懂的 都是高手

前段时间没空学习.小孩眼睛远视了.来来回回跑医院
然后又忙着拍抖音
现在稍微闲了点了.又一头扎进学习的海洋
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:419
  • 最近打卡:2025-06-29 00:37:16

8

主题

360

回帖

2532

积分

金牌会员

积分
2532
发表于 2024-6-28 14:19:46 | 显示全部楼层
梁*** 发表于 2024-6-28 13:46
但我在各论坛很少看到有人抱怨ARM的PWM难学、难用,他们会花几个月时间来啃明白。 ...

因为多数报怨会被无视
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-06-28 00:08:16

75

主题

6163

回帖

1万

积分

超级版主

积分
12932
发表于 2024-6-28 14:34:28 | 显示全部楼层
本帖最后由 梁工 于 2024-6-28 14:43 编辑
vb2*** 发表于 2024-6-28 14:01
PWM4N和PWM4N_2(PWM4N_4) 怎么选择哦.
没找到怎么弄

截图202406281430026884.jpg

截图202406281431549551.jpg

截图202406281433309578.jpg

截图202406281434201297.jpg

但是对于STC8H1K08-SOP6或TSSOP20,PWM选择的IO不同,比如SPWM4N_2在P3.3,其余的型号在P2.7。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:408
  • 最近打卡:2025-06-29 00:15:48
已绑定手机

144

主题

1702

回帖

2655

积分

金牌会员

积分
2655
发表于 2024-6-28 14:51:54 | 显示全部楼层
梁*** 发表于 2024-6-28 14:34
但是对于STC8H1K08-SOP6或TSSOP20,PWM选择的IO不同,比如SPWM4N_2在P3.3,其余的型号在P2.7。 ...

1N,2N,3N,4N
1P 2P 3P 4P 这个搞懂了.
就是 4N 里面又有4N_4  这个没搞懂意思

点评

PWM4N_4意思是PWM4N切换到的第4个引脚,。每路PWM的输出都在PWMx_PS有2bit选择一个引脚,4选1,看具体型号的引脚。  详情 回复 发表于 2024-6-28 15:32
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:408
  • 最近打卡:2025-06-29 00:15:48
已绑定手机

144

主题

1702

回帖

2655

积分

金牌会员

积分
2655
发表于 2024-6-28 14:53:37 | 显示全部楼层
梁*** 发表于 2024-6-28 14:34
但是对于STC8H1K08-SOP6或TSSOP20,PWM选择的IO不同,比如SPWM4N_2在P3.3,其余的型号在P2.7。 ...

截图202406281452502088.jpg

看管脚图,4N是 P1.7
4N_2又是P3.3

点评

是的,可以切换的。PWMx_PS里选择IO,2bit,可以选择4个IO,具体看IC型号。  详情 回复 发表于 2024-6-28 15:29
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-29 07:34 , Processed in 0.824970 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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