单片机产生正弦波

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

精心整理
单片机产生正弦波
一要求
采用单片机map430g2553和运算放大器lmv358产生正弦波,周期1秒。

二思路
可通过单片机产生PWM ,调节参数寄存器的值,产生不同占空比的PWM 信号。

若占空比的变化规律是正弦的,则滤波后可得到所需正弦波形。

其中,PWM (PulseWidthModulation )控制——脉冲宽度调制技术是通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。

图1为用PWM 波代替正弦半波的例子。

(单片机输出图1b ,滤波后得到图1a )
三实践
1PWM 状况只有N=200 则2PWM PWM ● SMCLK ),
(低频时
;第,● 周期计数:上升模式表明定时器由0递增到一个上限值CCR0。

CCR0需设置。

因为周期T=1/200秒,而定时器时钟=SMCLK=DCO=1M 赫兹,定时器周期t=1微秒,所以
CCR0=T/t=5000,即5毫秒。

● 高电平计数:定时器由0递增到一个上限值CCR0过程中,需设置脉宽CCR1。

并且K=CCR1/CCR0的数值每个周期(5毫秒)都变化一次,变化趋势满足正弦变化,200个5毫秒构成一个正弦变化周期。

为获得CCR1值,在matlab 中输入:
t=0:pi/100:2*pi;
k=(sin(t)+1)/2;
CCR1=round(4999*k);
可获得201个CCR1值。

上式中,第一行设置了201个数,均匀分布在0-2pi之间,第一个和最后一个分别对应0弧度和2pi弧度;第二行计算201个正弦值,偏置为0.5,全幅度为1的正弦波幅度,如图2所示:
图2偏置为0.5,全幅度为1的正弦波幅度
第三行计算CCR1值,为k与CCR0(这里是5000)的乘积,并取了四舍五入(round函数)。

为将数据导出,便于单片机编程,在matlab中添加:
fid=fopen('exp.txt','w');
fprintf(fid,'%d,',CCR1);
fclose(fid);
则在matlab工作目录中生成了带逗号的连续CCR1值。

复制到程序中,定义一个数组temp[200],其数值为matlab生成的数值。

3PWM实现流程
输出置0需置为4999
//
//|||
//||
//
#include
short
4920,4900,4877,4851,4823,4793,4761,4727,4690,4651,4610,4567,4522,4474,4425,
4374,4322,4267,4211,4152,4093,4031,3969,3904,3839,3772,3704,3634,3564,3492,
3420,3346,3272,3197,3121,3045,2968,2891,2813,2735,2656,2578,2500,2421,2343,
2264,2186,2108,2031,1954,1878,1802,1727,1653,1579,1507,1435,1365,1295,1227,
1160,1095,1030,968,906,847,788,732,677,625,574,525,477,432,389,348,309,272,
238,206,176,148,122,99,79,60,44,31,20,11,5,1,0,1,5,11,20,31,44,60,79,99,122,
148,176,206,238,272,309,348,389,432,477,525,574,625,677,732,788,847,906,968,
1030,1095,1160,1227,1295,1365,1435,1507,1579,1653,1727,1802,1878,1954,2031,
2108,2186,2264,2343,2421};
int i=0;
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;//Stopwatchdogtimer
if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF)
{
while(1); //Ifcalibrationconstantserased,trapCPU!!
}
BCSCTL1=CALBC1_1MHZ; //Setrange
DCOCTL=CALDCO_1MHZ; //SetDCOstep+modulation
BCSCTL3|=LFXT1S_2;//LFXT1=VLO
P1DIR=0x40;//P1.6output(greenLED)
P1OUT=0;//LEDoff
IFG1&=~OFIFG;//ClearOSCFaultflag
BCSCTL1|=DIVA_0; //ACLK=VLO
for
}
#pragma
{
if
{
}
else
{
}
if(temp[i]==4999)
{
CCR1=4998;
}
else
{
CCR1=temp[i];
}
}
//TimerA1InterruptVector(TA0IV)handler
#pragma vector=TIMER0_A1_VECTOR
__interruptvoid Timer_A1(void)
{
switch(TA0IV)
{
case2:P1OUT&=~BIT6;//P1.6outputLow
break;
case10:
break;
}
}
4输出滤波
输出运放采用lmv358。

其管脚如下图4所示:
图4358管脚示意图
主编,。

取增益A

可取
采用。

相关文档
最新文档