求教51单片机生成spwm波形的程序

求教51单片机生成spwm波形的程序,第1张

1、用普通I/O口采用软件定时器中断可以模拟SPWM输出。"/**/"里面的内用是对程序的标注,解析。

2、/*采用6MHz晶振,在P1.0脚上输出周期为2.5s,占空比为20%的脉冲信号*/

/*定时100ms,周期2.5s需25次中断,高电平0.5s需5次中断*/

#include <reg51.h>

typedef unsigned char uchar

sbit P1_0=P1^0

uchar time=0

uchar period=25

uchar high=5

void timer0() interrupt 1 using 1

{

TH0=0x3c/*定时器初值重装载*/

TL0=0xb0

time++

if(time==high) /*高电平持续时间结束,变低*/

{ P1_0=0}

else if(time==period) /*周期时间到,变高*/

{ time=0

P1_0=1

}

}

void main()

{

TMOD=0x01/*定时器0方式1*/

TH0=0x3c/*定时器装载初值*/

TL0=0xb0

EA=1/*开CPU中断*/

ET0=1/*开定时器0中断*/

TR0=1/*启动定时器0*/

while(1) /*等待中断*/

{}

}

3、说明:本程序主要采用了51单片机(具体型号STC89C52RC)的定时器,工作在方式3,来产生规定时间内的方波,制造SPWM.

首先,我要声明一点,单片机的浮点数处理能力非常弱的,你这个程序,基础可以用数组查表的方法来做,当然,你这么错不是不行,初学者可以用来做实验,但是高手可不会这么错。

言归正传,我来给你讲解一下这个do里面的思路。我们分步来看,先看sin(x),从 -3.1415---+3.1415

sin(x)的数值是多少?答案是0到-1再到0再到1再到0,这么个过程,这是高中的数学知识,如果你不明白,我就没有办法了。

搞明白了sin(x)的变化范围,我们就不难明白,如果不加以限制的,直接用 255*sin(x),那么,这个结果就会出现负数,变化范围是 0----(-255)---(0)----(255)---0,因为你需要把这个数值赋值给P1口,那么,你知道如果把一个负数赋值给 P1口是什么结果吗?因为负数在单片机里是用补码表示的,所以,把一个负数表示成无符号的数,它是很大的,所以P1口就会乱。

所以,为了避免负数,就要把sin(x)里产生的负数抵消去,怎么抵消?我们知道,sin(x)最小值是 -1,所以,只要 (1 + sin(x)),那么,这个结果就永远不可能小于0,这个的变化范围是

1----0----1----2----1

最大的数值是2,最小的是0

然后乘以 255再给P1口送去,我们又知道,P1口最大只能到 255,而你的式子(1 + sin(x))

最大是2,(1 + sin(x))*255最大得到的是 510,那为了不失真,所以,要把(1 + sin(x))*255再除以一个2,就得到你上面的结果了。

如果你是用的DA转换器,通过示波器,你可以看到一个如下公式的波形

f = 2.5*sin(2*3.1415926*f) + 2.5

这样的函数波形。

matlab中知道正弦函数的实部怎么求虚部:

1:打开软件

2:编辑所需要的信息

3:然后编辑好了之后确认,点击右上角的设置中心

4:在设置中心里面找到信息就可以了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11234715.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存