[活动专区] 【AT-START-L021测评】05 使用定时器互补输出产生SPWM

[复制链接]
2078|8
 楼主| 怀揣少年梦 发表于 2024-12-7 22:31 | 显示全部楼层 |阅读模式
一、什么是SPWM
最简单的理解就是PWM的占空比按照正弦波的规律而改变;详细的介绍,网络一搜一大把,就不赘述了。
二、SPWM的应用场合
用于需要精确控制电压和电流波形的场合,如交流电机调速、变频器、电力变换器以及UPS(不间断电源)等
三、实现原理
基本上是通过在一定时间内,产生的高电平和时间轴形成的面积与正弦波对应的部分面积相等的原理。实际实际可以参考下面一片文章
      真硬核!从零开始一文教你快速实现数字化SPWM纯正弦波逆变器
四、代码实现
       代码实现原理就是:通过定时3的产生40KHz的载波频率,产生一个溢出事件后就更新定时器互补输出通道的占空比的值,而定时器1输出互补的频率是根据需要更新多少个点,产生多少Hz的频率决定的。这样实时更新按照正弦波变化的占空比的值,最后去驱动H桥可以获得正弦波,但是我这次测评只是产生SPWM,并没有实际驱动H桥,产生SIN波。
1、获取等价于正弦波的脉冲宽度表
使用python工具产生。主要使用面积等效公式。
python代码如下:
  1. """
  2. 单极性
  3. """

  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. import math


  7. fig =plt.figure(figsize = (15,15))
  8. ax= fig.add_subplot(1,1,1)

  9. "正弦波分段数"
  10. seg_num =64

  11. "调制深度--调制波幅值与载波幅值的比值 这个调制深度可以调整正弦波的峰值"
  12. n = 0.5
  13. "定时器的计数值最大值"
  14. arr =1000

  15. "占空比序列"
  16. plus=[]
  17. "占空比寄存器序列"
  18. pluse_arr=[]
  19. "半个周期分段的每段的弧度"
  20. x=np.linspace(0,math.pi,seg_num+1)   
  21. sin_y = np.sin(x)

  22. for i in range(seg_num):
  23.     "正弦波对应的面积,式子是利用积分计算得到的"
  24.     sin_area = (np.cos(x[i])-np.cos(x[i+1]))
  25.     "占空比=正弦波面积占一个周期内多少"
  26.     duty = sin_area*n/x[1]
  27.     pwm= x[i]+duty*x[1]
  28.     "小数部分的占空比"
  29.     plus.append(duty)  
  30.     "对应计数器arr值的占空比"
  31.     pluse_arr.append(round(duty*arr))
  32.    
  33.     rect1 = plt.Rectangle((x[i],0,0), x[1]*duty,1,color ='Green')
  34.     ax.add_patch(rect1)
  35.    
  36.    
  37. print(plus)
  38. print('\r')
  39. print(pluse_arr)

  40. pic1 =plt.plot(x,sin_y)

运行上述代码输出的占空比变化表如下:
  1. uint32_t pwmVal[32]={

  2. /*32个点,调制深度为0.95    定时器为1000,单极性SPWM------8 */
  3.     47, 139, 231, 320, 406, 488, 566, 638,
  4.     704, 763, 815, 858, 894, 921, 939, 948,
  5.     948, 939, 921, 894, 858, 815, 763, 704,
  6.     638, 566, 488, 406, 320, 231, 139, 47

  7. };


波形如下:
波形.png

2、配置互补输出定时器
互补输出配置.png

3、配置产生定时更新PWM值得定时器
定时器中断.png

4、编写中断函数
  1. void TMR3_GLOBAL_IRQHandler(void)
  2. {
  3.   /* add user code begin TMR3_GLOBAL_IRQ 0 */
  4.         if (tmr_flag_get(TMR3,TMR_OVF_FLAG) != RESET) {
  5.                 tmr_flag_clear(TMR3,TMR_OVF_FLAG);
  6.                 TMR1->c3dt = pwmVal[pluse_cnt++];
  7.         }
  8.   /* add user code end TMR3_GLOBAL_IRQ 0 */


  9.   /* add user code begin TMR3_GLOBAL_IRQ 1 */

  10.   /* add user code end TMR3_GLOBAL_IRQ 1 */
  11. }



5、下载验证
结果如下:
1)互补输出结果
互补输出.png

2)定时器变化GIF图
波形变换.gif

3)加一个电容的波形
加了一个电容波形不是很理想,不太像正弦波,如果使用10uF的钽电容,波形会比较完美。
加一个电容的波形.png
源码如下:
SPWM.zip (2.14 MB, 下载次数: 2)




呐咯密密 发表于 2024-12-8 10:41 | 显示全部楼层
波形看起来奇奇怪怪的
 楼主| 怀揣少年梦 发表于 2024-12-8 15:02 | 显示全部楼层
呐咯密密 发表于 2024-12-8 10:41
波形看起来奇奇怪怪的

是的,因为电容原因,波形和标准的正弦波有点差距
海洋无限 发表于 2024-12-8 17:36 | 显示全部楼层
软件直接中文的,看起来很友好啊
 楼主| 怀揣少年梦 发表于 2024-12-9 08:38 | 显示全部楼层
海洋无限 发表于 2024-12-8 17:36
软件直接中文的,看起来很友好啊

是的,个人使用起来还是很好上手和使用的
caigang13 发表于 2024-12-9 08:41 来自手机 | 显示全部楼层
这个上位机软件用起来不错
 楼主| 怀揣少年梦 发表于 2024-12-9 08:49 | 显示全部楼层
caigang13 发表于 2024-12-9 08:41
这个上位机软件用起来不错

开箱即用
海洋无限 发表于 2024-12-9 11:09 | 显示全部楼层
怀揣少年梦 发表于 2024-12-9 08:38
是的,个人使用起来还是很好上手和使用的

可以    有空来学习学习
 楼主| 怀揣少年梦 发表于 2024-12-9 14:39 | 显示全部楼层
海洋无限 发表于 2024-12-9 11:09
可以    有空来学习学习

大佬学起来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:一切皆有可能

45

主题

473

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部