历史上的今天
返回首页

历史上的今天

今天是:2025年01月26日(星期日)

2019年01月26日 | SPWM波在单片机上的实现与调节(基于MSP430F5529)

2019-01-26 来源:eefocus

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中断频率 

调节幅度要依据载波中最大与最小占空比之差也即是调制深度,这个没有公式…….. 

剩下的就要参考我给出的程序作出自己的理解吧,靠你们了,骚年们! 


程序示例:


函数

/*----------------------------------------------------------------------------------------------

 * 功能:产生单路SPWM波

 * 输入:无

 * 输出:P1.4

 * 注意:定时器也为TA1.1;载波频率为126.26K;;默认正弦频率为100HZ,幅度未知

 */

void SPWM_1Way_Init(void)

{

    P1SEL |=BIT4;

    P1DIR |=BIT4;

    //P1DS |=BIT4; //全力驱动

    P1OUT &=~BIT4;

    spwm_i=0;

    TA0CCR0 =198;//载波126.26KHZ

    TA0CCR3 =Lab1[spwm_i];

    TA0CCTL3 =OUTMOD_7;

    TA0CTL =TASSEL_2+MC_1+TACLR;//选择时钟为SMCLK,UP模式


    P2SEL |=BIT0;

    P2DIR |=BIT0;

    P2OUT &=~BIT0;

    TA1CCR0 =2499;//25000000/(100*100)=2500:100Hz,100个点:10KHZ(时间不太准我做了些补偿)

    TA1CTL =TASSEL_2+MC_1+TACLR;//选择时钟为SMCLK,UP模式

    TA1CTL  |= TAIE;//开启中断


    __enable_interrupt();//开启总中断

}

void SPWM_1Way_Set_Freq(unsigned int freq)

{

    unsigned long freq_num;

    freq_num=250000/(freq)-1;

    TA1CCR0 =freq_num;

}

/*

 * 功能:输出两路SPWM波,相位可调

 * 输入:无

 * 输出:P1.4,P1.5

 * 注意:定时器也为TA1.1;载波频率为126.26K;;默认正弦频率为100HZ,幅度未知

 */

void SPWM_2Way_Init(void)

{

    P1SEL |=BIT4+BIT5;

    P1DIR |=BIT4+BIT5;

    //P1DS |=BIT4+BIT5; //全力驱动

    P1OUT &=~BIT4+BIT5;

    spwm_i=0;

    spwm_j=50;//控制相位

    TA0CCR0 =198;//载波126.26KHZ

    TA0CCR3 =Lab1[spwm_i];

    TA0CCR4 =Lab1[spwm_j];

    TA0CCTL3 =OUTMOD_7;

    TA0CCTL4 =OUTMOD_7;

    TA0CTL =TASSEL_2+MC_1+TACLR;//选择时钟为SMCLK,UP模式


    P2SEL |=BIT0;

    P2DIR |=BIT0;

    P2OUT &=~BIT0;

    TA1CCR0 =2499;//25000000/(100*100)=2500:100Hz,100个点:10KHZ

    TA1CTL =TASSEL_2+MC_1+TACLR;//选择时钟为SMCLK,UP模式

    TA1CTL  |= TAIE;//开启中断


    __enable_interrupt();//开启总中断

}

void SPWM_2Way_Set_Freq(unsigned int freq)

{

    unsigned long freq_num;

    freq_num=250000/(freq)-1;

    TA1CCR0 =freq_num;

}

/*

 * 功能:中断函数,改变SPWM中占空比寄存器的值

 * 输入:无

 * 输出:无

 * 注意:为0时双路输出,为1时单路输出

 */

#if 0

#pragma vector=TIMER1_A1_VECTOR

__interrupt void TimerA1(void)

{

        TA0CCR3 =Lab1[spwm_i++];

        if(spwm_i==100)spwm_i=0;

    TA1IV=0;    //GPIO的单独中断会自动清零,可TIMER的不会,所以要软件清零;!!

}

#else

#pragma vector=TIMER1_A1_VECTOR

__interrupt void TimerA1(void)

{

    TA0CCR3 =Lab1[spwm_i++];

    if(spwm_i==100)spwm_i=0;

    TA0CCR4 =Lab1[spwm_j++];

    if(spwm_j==100)spwm_j=0;

    TA1IV=0;    //GPIO的单独中断会自动清零,可TIMER的不会,所以要软件清零;!!

}

#endif


头文件PWM.h

/*

 * PWM.h

 *

 *  Created on: 2016-8-22

 *      Author: Flyskyr

 */


#ifndef PWM_H_

#define PWM_H_


extern unsigned int spwm_i,spwm_j;

extern unsigned int Lab_base[];

extern float Lab1[];


extern void SPWM_1Way_Init(void);

extern void SPWM_1Way_Set_Freq(unsigned int freq);

extern void SPWM_2Way_Init(void);

extern void SPWM_2Way_Set_Freq(unsigned int freq);


#endif /* PWM_H_ */


头文件include.h

/*

 * include.h

 *

 *  Created on: 2016-8-18

 *      Author: Flyskyr

 */


#include

#include"PWM.h"


unsigned int spwm_i,spwm_j;

unsigned int Lab_base[]={99,105,111,117,123,129,135,141,146,152,157,162,166,171,175,179,182,185,188,191,193,194,196,197,197,198,197,197,196,194,193,191,188,185,182,179,175,171,166,162,157,152,146,141,135,129,123,117,111,105,99,92,86,80,74,68,62,56,51,45,40,35,31,26,22,18,15,12,9,6,4,3,1,0,0,0,0,0,1,3,4,6,9,12,15,18,22,26,31,35,40,45,51,56,62,68,74,80,86,92

};

float Lab1[]={99,105,111,117,123,129,135,141,146,152,157,162,166,171,175,179,182,185,188,191,193,194,196,197,197,198,197,197,196,194,193,191,188,185,182,179,175,171,166,162,157,152,146,141,135,129,123,117,111,105,99,92,86,80,74,68,62,56,51,45,40,35,31,26,22,18,15,12,9,6,4,3,1,0,0,0,0,0,1,3,4,6,9,12,15,18,22,26,31,35,40,45,51,56,62,68,74,80,86,92

};//这个float数组我是用来调节调制深度的,改变这里的值就可以改变输出的幅度了


推荐阅读

史海拾趣

Artaflex公司的发展小趣事

面对全球电子市场的不断扩张,Artaflex公司制定了全球化的发展战略。公司通过设立海外分支机构、拓展国际市场、参与国际展会等方式,不断提升品牌知名度和市场份额。同时,公司还积极引进国际先进技术和管理经验,提升自身的竞争力。这一战略的实施使得Artaflex在全球电子行业中占据了重要地位。

AINFO Inc公司的发展小趣事

为了进一步提升技术水平和市场竞争力,AINFO Inc公司积极寻求与国际知名企业的技术合作。通过与国外企业的合作,公司引进了先进的技术和管理经验,提升了自身的研发能力和管理水平。同时,公司也加快了国际化发展的步伐,拓展了海外市场,提升了品牌知名度。

Ecera Comtek Corp公司的发展小趣事

Ecera Comtek Corp公司成立于XX世纪初,由几位热衷于电子通信技术的工程师共同创立。初创时期,公司面临着资金短缺、技术挑战和市场竞争等多重压力。然而,创始人们凭借对技术的热情和执着,不断研发创新产品,逐渐在行业内树立了口碑。他们经常通宵达旦地工作,试验新的设计方案,努力提升产品的性能和稳定性。经过数年的努力,Ecera Comtek Corp公司终于推出了首款具有竞争力的无线通信设备,为公司的发展奠定了坚实的基础。

Freqtech Ohg公司的发展小趣事

随着业务的不断增长,Freqtech Ohg公司开始实施全球化战略。公司首先在欧洲建立了研发中心,随后在亚洲市场设立了生产基地和销售网络。通过整合全球资源,Freqtech不仅降低了生产成本,还更快速地响应了不同地区客户的需求。同时,公司积极参与国际展会和技术交流,不断提升品牌知名度和影响力,为公司的全球化发展奠定了坚实基础。

Elpaq公司的发展小趣事
Elite Enterprises (H K) Co Ltd公司的发展小趣事

Elite Enterprises (H K) Co Ltd成立于2002年,当时正值LED技术快速发展的时期。公司创始人凭借对LED市场的敏锐洞察,决定专注于LED产品的研发和生产。初期,公司面临资金、技术和市场等多重挑战,但通过不懈努力和持续创新,逐步在LED照明市场崭露头角。

问答坊 | AI 解惑

音响功放开关稳压电源电路.jpg

本帖最后由 paulhyde 于 2014-9-15 09:38 编辑 音响功放开关稳压电源电路.jpg  …

查看全部问答>

想购买一个二手的编程器(烧录器)

要求能够写PIC系列的和ARM系列的MCU,我在广州, 有的联系,QQ:82348559,电:020-82348559…

查看全部问答>

电压基准设计指南

电压基准设计指南 第八版 电压基准设计指南 第七版…

查看全部问答>

关于LED灯电流的问题

今天做实验,本来我的驱动板能驱动3.8V 650ma的电流; 给1W的LED(3.3v350ma)的通电,长时间后,虽然电压 没有多大的变化3。8+-0.1V;LED的电流就开始乱跳 , 为470MA-520ma;再也升不到650,这是为何原因;我这个 驱动其实是为1*3W的灯做的驱 ...…

查看全部问答>

USB 打开管道

我在wince5.0下调时一个camera驱动,打开管道有问题 我的camera有两个EndPoints,有一个control endpoint,EndPoint 0;还有一个Video Data EndPoint,EndPoint 1 现在,我要传输Video data,需要打开pipe,就OpenPipe,结果返回值为NULL,GetLas ...…

查看全部问答>

汇编中经常看到.text是什么区域?

如题,一般什么内容适合放在该区域呢?…

查看全部问答>

求助:熔丝配置成了CKSEL=0000,SUT=00

我首先外接了另外一片正常工作的单片机,其振荡频率为7.3728M(外接晶体振荡器),从此单片机的XTAL1上或XTAL2上引出线到配置错的单片机的XTAL1(未外接任何其他元件)上(同一个电源供电),还是配置不了熔丝,该怎么办啊 …

查看全部问答>

如何烧写到开发板

EVC编好的exe程序如何烧写到ARM板上,板子是2410的, 哪位大虾给讲一下大致的步骤?可以通过USB口烧吗? JTAG怎么用? …

查看全部问答>

什么函数可以判断键盘是否有输入啊?

各位高手,我希望在shell中实现如下功能:输入任务名Test后不停的执行doTest函数,并输出结果,一旦按下键盘上任意按键,就停止执行,我尝试用getchar()来判断,但它只要放在循环里就会卡住一直等待按键输入,这显然不符合我的要求,请问该怎样实现 ...…

查看全部问答>

蹭网100分~!

我现在住的地方用我的笔记本内置无线网卡可接收到外面的无线信号,但是只有一格,连接的时候显示连接不成功,我想问下有什么方法可增强我这的接收信号强度?是否能用无线AP或是无线路由器做客户端来实现增强信号上网?可行性有多大?推荐哪种型号?…

查看全部问答>