找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5406|回复: 5
收起左侧

SPWM波在单片机上的实现与调节(基于MSP430F5529)

[复制链接]
ID:291011 发表于 2018-3-12 21:18 | 显示全部楼层 |阅读模式
SPWM波的定义和生成方法在这里就不多说了,本文主要说SPWM波在单片机上的实现,以及如何调节滤出后的正弦波的频率及幅度。
先弄清楚SPWM在单片机上如何产生,比如你要输出100HZ的SPWM正弦波,每个周期100个点,则定时器B的中断频率为100*100=10K,用于载波(定时器A)的PWM频率应>=10K(这里我建议载波为1M,因为定时器的配合问题会有+-1的误差,所以载波尽量的大则滤出的正弦波的波形越好)。
通过软件,你先得到100个点的正弦波采样值,你可以用定时器A来产生1MHZ的PWM,然后用定时器B,做定时器中断,10KHZ的频率,每次中断,就把一个采样值赋值给定时器A的输出通道:CCRx。然后不停的循环,每中断一百次,就输出1个波。不停的循环就不停的输出,那么PWM输出端,经过滤波后(外部滤波电路要找相关电路去设计),就是100HZ的正弦波了。
调节频率要通过定时器B,公式:正弦波频率*每个周期的点数=定时器B中断频率
调节幅度要依据载波中最大与最小占空比之差也即是调制深度,这个没有公式……..
剩下的就要参考我给出的程序作出自己的理解吧,靠你们了,骚年们!
0.png

单片机源程序如下:
  1. /*===========================================================================
  2. *  Name        :   PWM.h
  3. *  Function    :
  4. *  Created on  :   2019年12月5日
  5. *  Author      :   Laptop
  6. *===========================================================================*/
  7. #include "SPWM.h"

  8. /*============================================================================
  9. * 功能   :   产生单路SPWM波
  10. * 输入   :   无
  11. * 输出   :   P1.4
  12. * 注意   :   定时器也为TA1.1;载波频率为126.26K;;默认正弦频率为100HZ,幅度未知
  13. *============================================================================*/
  14. //初始化1路
  15. void SPWM_1Way_Init(void)
  16. {
  17.     P1SEL |=BIT4;
  18.     P1DIR |=BIT4;
  19.     //P1DS |=BIT4;                              //全力驱动
  20.     P1OUT &=~BIT4;
  21.     spwm_i=0;
  22.     TA0CCR0 =198;                               //载波126.26KHZ
  23.     TA0CCR3 =Lab1[spwm_i];
  24.     TA0CCTL3 =OUTMOD_7;
  25.     TA0CTL =TASSEL_2+MC_1+TACLR;                //选择时钟为SMCLK,UP模式

  26.     P2SEL |=BIT0;
  27.     P2DIR |=BIT0;
  28.     P2OUT &=~BIT0;
  29.     TA1CCR0 =2499;                              //25000000/(100*100)=2500:100Hz,100个点:10KHZ(时间不太准我做了些补偿)
  30.     TA1CTL =TASSEL_2+MC_1+TACLR;                //选择时钟为SMCLK,UP模式
  31.     TA1CTL  |= TAIE;                            //开启中断

  32.     __enable_interrupt();                       //开启总中断
  33. }

  34. //输出1路
  35. void SPWM_1Way_Set_Freq(unsigned int freq)
  36. {
  37.     unsigned long freq_num;
  38.     freq_num=250000/(freq)-1;
  39.     TA1CCR0 =freq_num;
  40. }

  41. /*================================================================================
  42. * 功能   :   输出两路SPWM波,相位可调
  43. * 输入   :   无
  44. * 输出   :    P1.4,P1.5
  45. * 注意   :   定时器也为TA1.1;载波频率为126.26K;;默认正弦频率为100HZ,幅度未知
  46. *================================================================================*/
  47. //初始化2路
  48. void SPWM_2Way_Init(void)
  49. {
  50.     P1SEL |=BIT4+BIT5;
  51.     P1DIR |=BIT4+BIT5;
  52.     //P1DS |=BIT4+BIT5;                         //全力驱动
  53.     P1OUT &=~BIT4+BIT5;
  54.     spwm_i=0;
  55.     spwm_j=50;                                  //控制相位
  56.     TA0CCR0 =198;                               //载波126.26KHZ
  57.     TA0CCR3 =Lab1[spwm_i];
  58.     TA0CCR4 =Lab1[spwm_j];
  59.     TA0CCTL3 =OUTMOD_7;
  60.     TA0CCTL4 =OUTMOD_7;
  61.     TA0CTL =TASSEL_2+MC_1+TACLR;                //选择时钟为SMCLK,UP模式

  62.     P2SEL |=BIT0;
  63.     P2DIR |=BIT0;
  64.     P2OUT &=~BIT0;
  65.     TA1CCR0 =2499;                              //25000000/(100*100)=2500:100Hz,100个点:10KHZ
  66.     TA1CTL =TASSEL_2+MC_1+TACLR;                //选择时钟为SMCLK,UP模式
  67.     TA1CTL  |= TAIE;                            //开启中断

  68.     __enable_interrupt();                       //开启总中断
  69. }

  70. //输出2路
  71. void SPWM_2Way_Set_Freq(unsigned int freq)
  72. {
  73.     unsigned long freq_num;
  74.     freq_num=250000/(freq)-1;
  75.     TA1CCR0 =freq_num;
  76. }

  77. /*===============================================================
  78. * 功能   :   中断函数,改变SPWM中占空比寄存器的值
  79. * 输入   :   无
  80. * 输出   :   无
  81. * 注意   :   为0时双路输出,为1时单路输出
  82. *===============================================================*/
  83. #if 0
  84. #pragma vector=TIMER1_A1_VECTOR
  85. __interrupt void TimerA1(void)
  86. {
  87.     TA0CCR3 =Lab1[spwm_i++];
  88.     if(spwm_i==100)spwm_i=0;
  89.     TA1IV=0;                                        //GPIO的单独中断会自动清零,可TIMER的不会,所以要软件清零;!!
  90. ……………………

  91. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
SPWM_01.zip (65.89 KB, 下载次数: 103)
回复

使用道具 举报

ID:291244 发表于 2018-3-13 13:53 来自手机 | 显示全部楼层
不错不错,值得学习
回复

使用道具 举报

ID:292048 发表于 2018-3-14 21:47 | 显示全部楼层
很不错呀,值得学习
回复

使用道具 举报

ID:376844 发表于 2018-7-22 15:50 | 显示全部楼层
可以的
回复

使用道具 举报

ID:593035 发表于 2019-7-31 14:26 | 显示全部楼层
感谢!!
回复

使用道具 举报

ID:952671 发表于 2021-7-20 10:44 | 显示全部楼层
有调出来波的吗
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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