找回密码
 立即注册
查看: 1678|回复: 5

STC32F12追风剑PWM与IO口极限频率测试

[复制链接]

1

主题

1

回帖

19

积分

新手上路

积分
19
发表于 2023-7-12 19:02:07 | 显示全部楼层 |阅读模式
本帖最后由 maomaotou 于 2023-7-12 19:16 编辑

感谢STC,感谢石小姐。在看到STC32F12系列PWM高达144MHz的宣传后,迫不及待地申请到了两块追风剑的开发板。
先发一张开发板外观图。
1.jpg
PWM输入频率高,意味着同等频率下,我们的波形可以更加精细,分辨率更高
假设输入PWM外设的频率为50MHz,我们要输出5MHz的PWM波形,只能让PSC*ARR=10,且其分辨率最多不超过10个单位,即0.02us
如果我们能够令PWM外设的输入频率变成100MHz,那么输出5MHz的波形时,分辨率就可以达到20个单位,即0.01us
按照STC手册,我们如下配置时钟树
2.jpg

由于PCKI推荐输出信号为6MHz,故我们利用HPLL在合理范围内最高能将其倍频到246MHz。
我们需要使能HPLLCR.ENHPLLCLKSEL.HSIOCK,这样HSPWMA就有了高速的时钟信号输入。HSCLKDIV我们配置为0,不再分频。
时钟配置代码如下:
  1. HIRCCR=0x80;
  2. while(!(HIRCCR&0x01));
  3. CLKSEL=0x00;
  4. HPLLCR=0x0f;
  5. HPLLCR|=0x80;
  6. Delay_ms(1);
  7. CLKSEL|=0x40;
  8. HSCLKDIV=0;
复制代码

时钟配置完毕,接下来让我们配置HSPWMA。
本次测试中我最大的心得体会便是,做STC的开发,一定要先照手册的例程抄,再看寄存器有关的代码配置。光看HSPWMA的地址/数据寄存器和异步写入那一块,我晕头转向也搞不懂这一节再说啥,为啥配置个PWM还要异步写入呢?直到我看到后面的例程我才真正理解这一节文档开头所说的:“STC32F 系列单片机为高级 PWMA 和高级 PWMB 提供了高速模式 (HSPWMA 和HSPWMB)。高速高级 PWM是以高级 PWMA 和高级 PWMB 为基础,增加了高速模式”这一句话。配置HSPWMA的代码如下:
  1. #include <stc32g.h>
  2. #include <intrins.h>
  3. //56MHz
  4. sbit LED=P2^7;
  5. void Delay_ms(unsigned int n)                //@56MHz
  6. {
  7.         unsigned long edata i;
  8.         unsigned int j;
  9.         for(j=0;j<n;j++){
  10.                 _nop_();
  11.                 _nop_();
  12.                 _nop_();
  13.                 i = 13998UL;
  14.                 while (i) i--;
  15.         }
  16. }
  17. #define _10kHZ_Mode
  18. #ifndef _10kHZ_Mode
  19. #define CLOCK_HZ 10
  20. #define PRESCALER 46322
  21. #define RELOAD 10000/CLOCK_HZ
  22. #else
  23. #define CLOCK_10kHZ 150
  24. #define PRESCALER 23161/CLOCK_10kHZ
  25. #define RELOAD 2
  26. #endif
  27. void WritePWMA(char addr,char dat){
  28.         while(HSPWMA_ADR&0x80);
  29.         HSPWMA_DAT=dat;
  30.         HSPWMA_ADR=addr&0x7f;
  31. }
  32. void HSPWM_configure(){
  33.         HPLLCR=0x0f;
  34.         HPLLCR|=0x80;
  35.         Delay_ms(1);
  36.         CLKSEL|=0x40;
  37.         HSCLKDIV=0;
  38.        
  39.         //156MHz
  40.        
  41.         //PWM OUTPUT @ P2^7 1Hz 15600 10000 PWM4N
  42.         HSPWMA_CFG=0x03;
  43.         PWMA_PS=0x40;
  44.         WritePWMA((char)&PWMA_ENO,0x80);
  45.         WritePWMA((char)&PWMA_PSCRH,PRESCALER>>8);
  46.         WritePWMA((char)&PWMA_PSCRL,(PRESCALER&0xff)-1);
  47.         WritePWMA((char)&PWMA_ARRH,RELOAD>>8);
  48.         WritePWMA((char)&PWMA_ARRL,(RELOAD&0xff)-1);
  49.         WritePWMA((char)&PWMA_CCER2,0x00);
  50.         WritePWMA((char)&PWMA_CCMR4,0x60);
  51.         WritePWMA((char)&PWMA_CCER2,0x40);
  52.         #ifndef _10kHZ_Mode
  53.                 WritePWMA((char)&PWMA_CCR4H,(RELOAD/2)>>8);
  54.                 WritePWMA((char)&PWMA_CCR4L,((RELOAD/2)&0xff));
  55.         #else
  56.                 WritePWMA((char)&PWMA_CCR4H,(1)>>8);
  57.                 WritePWMA((char)&PWMA_CCR4L,((1)&0xff));
  58.         #endif
  59.         WritePWMA((char)&PWMA_BKR,0x80);
  60.         WritePWMA((char)&PWMA_CR1,0x01);
  61. }
  62. int main(){
  63.         EAXFR=1;
  64.         HIRCCR=0x80;
  65.         while(!(HIRCCR&0x01));
  66.         CLKSEL=0x00;
  67.         P2M0=0x00;
  68.         P2M1=0x00;
  69.         HSPWM_configure();
  70.         while(1){
  71.                
  72.         }
  73.         return 0;
  74. }
复制代码

这里46322和23161里的两个数据是根据经验测得的分频系数。这里我们的PWM占空比默认为50%。使/失能_10kHZ_Mode,更改CLOCK_HZ或CLOCK_10kHZ的值可以改变PWM的输出频率。

这样理论上STC的IO口可以使用HSPWM输出特别高的频率。

接下来就是我们的测试环节。IRC配置为56MHz。我们改变上述宏定义的值,观察其IO口输出。
实验一:15MHz输出。
15mhz.jpg
我们发现在这个较高的频率下,IO口输出波形能够接受。
实验二:20MHz输出。
20mhz.jpg
此时IO口输出波形已经从方波基本退化成了正弦波。
实验三:50MHz输出。
50mhz_2.jpg
50mhz_1.jpg

此时IO口输出波形已经完全没法使用,频率在,但是幅度太小。

实验结论:PWM很给力,输入频率可以调的很高,分辨率也可以很精细。IO口极限输出频率为25MHz左右。


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-03-09 19:40:01

9

主题

328

回帖

4501

积分

荣誉版主

积分
4501
发表于 2023-7-12 21:00:16 | 显示全部楼层

手册上的规格:
5V供电
Screenshot 2023-07-12 205845.png
3.3V供电
Screenshot 2023-07-12 205901.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:45
  • 最近打卡:2025-02-14 13:39:49
已绑定手机

19

主题

273

回帖

2152

积分

金牌会员

积分
2152
QQ
发表于 2023-7-13 09:00:00 | 显示全部楼层
感谢分享!
QQ:1638975601
手机:19952583876(微信同号)
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2023-7-13 15:45:09 | 显示全部楼层
IO的速度,5V时,上升沿、下降沿均在15ns左右,IO输出最高频率大约25~35MHz。

STC32F的PWM高速时钟可以到300KHz左右,这个对于输出高频率的PWM非常有好处,比如输出音频信号(比如PWM长度为12bit,PWM时钟300MHz,则可以输出75KHz的PWM,声音非常好,甚至可以直接驱动MOSFET做D类驱动扬声器,功放都免了)。

PWM时钟高,则输出高频的PWM时仍能有较精细的分辨率,但要注意,当输出的脉冲(高电平、低电平一样)小于IO上升、下降沿的15ns时,将不能响应,在300MHz时钟时对应的PWM宽度为5个时钟。距离来说,要输出一个频率1Mhz的PWM,则1%占空比是没法输出的,因为1%占空比对应10ns,小于IO上升、下降沿的15ns,同理输出99%占空比也是不行的。当占空比为2%~98%之间,就可以正常输出。
回复 支持 反对

使用道具 举报 送花

1

主题

1

回帖

19

积分

新手上路

积分
19
发表于 2023-7-13 15:51:13 | 显示全部楼层
梁*** 发表于 2023-7-13 15:45
IO的速度,5V时,上升沿、下降沿均在15ns左右,IO输出最高频率大约25~35MHz。

STC32F的PWM高速时钟可以到3 ...

是的,这个pwm在同价位的mcu里确实厉害。请问梁工用PWM输出音频信号,滤波电路应该怎么设计?STC有例程嘛

点评

正在写例程。 输出接RC滤波电路,最好是一阶无源RC+2阶有源RC,效果最好。  详情 回复 发表于 2023-7-13 16:53
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2023-7-13 16:53:45 | 显示全部楼层
maoma*** 发表于 2023-7-13 15:51
是的,这个pwm在同价位的mcu里确实厉害。请问梁工用PWM输出音频信号,滤波电路应该怎么设计?STC有例程嘛 ...

正在写例程。
输出接RC滤波电路,最好是一阶无源RC+2阶有源RC,效果最好。

1.png

回复 支持 1 反对 0

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:32 , Processed in 0.184319 second(s), 88 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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