❶ 关于单片机产生PWM波,我使用调制波载波比较方法生成一个SPWM波,那么如果想要调整占空比如何调整
单片机产生PWM波,用调制波载波生成一个SPWM波,所谓SPWM是 用 PWM 生成载有正弦波分量的一种PWM波 称为 SPWM 波,通过电感、电容回路 可以得到 正弦波。单片机要产生 SPWM 波,就是 要 让 PWM 波 按照 正弦波的 规律 调节 PWM 波的 占空比 就是 SPWM 波。
❷ 51单片机软件产生spwm程序
主要看你用汇编 还是用C 如果用C得就是建常亮数组,如果用汇编,就像下面这样的表格
Number_table1:
;dp decbhgfa
;-------------------------------------
db 11110011b ;0 11000000b
❸ 简述spwm控制的工作原理
一个连续函数是可以用无限多个离散函数逼近或替代的,因而可以设想用多个不同幅值的矩形脉冲波来替代正弦波,在一个正弦半波上分割出多个等宽不等幅的波形(假设分出的波形数目n=12);
如果每一个矩形波的面积都与相应时间段内正弦波的面积相等,则这一系列矩形波的合成面积就等于正弦波的面积,也即有等效的作用。为了提高等效的精度,矩形波的个数越多越好,显然,矩形波的数目受到开关器件允许开关频率的限制。
例如,把正弦半波分作n等分(n=9),把每一等分的正弦曲线与横轴所包围的面积都用一个与此面积相等的矩形脉冲来代替,矩形脉冲的幅值不变,各脉冲的中点与正弦波每一等分的中点相重合,这样就形成spwm波形。
同样,正弦波的负半周也可用相同的方法与一系列负脉冲波等效。这种正弦波正、负半周分别用正、负脉冲等效的spwm波形称作单极式spwm。
单片机生成
市场上使用的很多单片机都有生成SPWM控制波形的功能,该生成波形外接驱动电路即可驱动功率桥,达到逆变的目的。应该说,只要具有PWM模块和定时器模块的单片机都可以完成此任务。
具体实现即首先将正弦表赋值给数组。然后PWM波形发生模块每个PWM周期进入中断,在ISR中按照正弦表更改PWM比较器的值,依次循环即可。
❹ 用单片机输出 spwm 波形
stc12c5608ad单片机有硬件PWM功能,只要在主程序里按正弦规律改变输出脉冲的占空比即可,可将正弦波分成50个时间段,每个时间段是20ms/500=400us,用定时器定时400us改变一次CCAP1L的值(该值除以256即是占空比)即可,CCAP1L的值可以在程序中用三角函数计算,也可以事先计算好存入数组中.
/*******************************/
void PWM_init (void){//PWM初始化函数
CMOD=0x02; //设置PCA定时器,计数频率为晶振频率/2 当为12Mhz时,PWM输出频率约23.4Khz
CL=0x00;
CH=0x00;
CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(0100 0010)
CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
CCAP1H=0x00; // PWM1初始时为0
CR=1; //启动PCA定时器
}
/******************************************************************************/void PWM1_set (uchar a)//PWM1占空比设置函数
{
CCAP1L=a; //设置值直接写入CCAP1L
CCAP1H=a; //设置值直接写入CCAP1H
}
❺ 单片机产生spwm波
#include <AT89X52.H>
unsigned char code table[]={127,
130,
133,
136,
139,
143,
146,
149,
152,
155,
158,
161,
164,
167,
170,
173,
176,
179,
182,
184,
187,
190,
193,
195,
198,
200,
203,
205,
208,
210,
213,
215,
217,
219,
221,
224,
226,
228,
229,
231,
233,
235,
236,
238,
239,
241,
242,
244,
245,
246,
247,
248,
249,
250,
251,
251,
252,
253,
253,
254,
254,
254,
254,
254,
255,
254,
254,
254,
254,
254,
253,
253,
252,
251,
251,
250,
249,
248,
247,
246,
245,
244,
242,
241,
239,
238,
236,
235,
233,
231,
229,
228,
226,
224,
221,
219,
217,
215,
213,
210,
208,
205,
203,
200,
198,
195,
193,
190,
187,
184,
182,
179,
176,
173,
170,
167,
164,
161,
158,
155,
152,
149,
146,
143,
139,
136,
133,
130,
127,
124,
121,
118,
115,
111,
108,
105,
102,
99,
96,
93,
90,
87,
84,
81,
78,
75,
72,
70,
67,
64,
61,
59,
56,
54,
51,
49,
46,
44,
41,
39,
37,
35,
33,
30,
28,
26,
25,
23,
21,
19,
18,
16,
15,
13,
12,
10,
9,
8,
7,
6,
5,
4,
3,
3,
2,
1,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
1,
2,
3,
3,
4,
5,
6,
7,
8,
9,
10,
12,
13,
15,
16,
18,
19,
21,
23,
25,
26,
28,
30,
33,
35,
37,
39,
41,
44,
46,
49,
51,
54,
56,
59,
61,
64,
67,
70,
72,
75,
78,
81,
84,
87,
90,
93,
96,
99,
102,
105,
108,
111,
115,
118,
121,
124,
};
//-----------------------定义管脚--------------------------------------------------------
#define PWM_T 255 //定义PWM的周期T为10ms
unsigned char PWM_t; //PWM_t为脉冲宽度(0~100)时间为0~10ms
unsigned char time_count; //定时计数
unsigned char a;
sbit PWM=P2^7; //PWM 波形输出
void main(void)
{
PWM=0;
PWM_t=0;
TMOD=0x12; /*定时器1为工作模式1,0为模式2(8位自动重装) */
TH0=0x216; //保证定时时长为0.1ms
TL0=0x216;
TR0=1;
ET0=1;
EX0=1;
EA=1;
while(1)
{
}
}
void t0(void) interrupt 1 using 0
{
time_count++;
if(time_count>=PWM_t)
{
time_count=0;
a++;
if(a>=255)
a=0;
}
if(time_count<table[a])
PWM=1;
else
PWM=0;
}
void M() interrupt 0
{
PWM_t = PWM_t+ 20;
}
❻ 怎样用51单片机实现可控三相spwm波的产生
是想仿真,还是要做实物。用单片机,要写程序的,有点麻烦。
做实物,可以用专用的芯片EG8083。
❼ 新人求助,怎么用51单片机产生SPWM波
用51单片机产生SPWM波,所谓SPWM波、就是PWM波 的占空比按照正弦波的规律 变化,也就是PWM波 是 正弦波的 载波,编程时 按照 正弦波 的 规律 调整 PWM 的占空比 就可以了。
❽ 基于STC51系列单片机的SPWM波形实现,程序如何编写急急急急
/*********************************************************
// 载波比选为N=24,调制比M=Uc/Ur=1,晶振频率12M
// 正弦波频率50Hz
// 高电平的宽度Tpw = Tt/2*(1+Msimwt)
// 低电平的宽度Tpw = Tt/2*(1-Msimwt)
// Tt周期
// T2是产生SPWM波形,并从P1^1输出,用导线连接到P3.4作为测试频率使用。
// T1工作在定时方式1,定时1s
// T0工作在计数方式,对输入的脉冲进行计数,溢出产生中断。
// 16位计数器最大值是65536,1s内可能会产生多次溢出,所以在中断处理程序对中断的次数进行
// 计数。1s到后,将中断的计数器里的计数值取出进行综合处理,处理后的数据送显示。
//信号频率的计算方法:
// T0工作在计数方式,假设1s内溢出C1次,最后未溢出的计数值是C2,则频率公式为:
// F=C1*2^16+C2 = C1*65536+TH0*256+TL0)
//使用12MHz时钟,测量的最大范围是不大于500KHz。
*********************************************************/
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar disp[8]={0,0,0,0,0,0,0,0};
uchar FreStr[]="Friquency is:";
uchar T0count,T1count;
uchar code x[]={66,38,26,89,15,97,7,102,2,103,1,102,2,
97,7,89,15,78,26,66,38,38,66,26,78,15,
89,7,97,2,102,1,103,1,103,2,102,7,97,15,
89,26,78,38,66};
uchar ky,kc,count=255;
sbit L1=P1^1;
void delayms(uchar ms)
{
uchar i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}
//LCD定义开始
//以下三个是定义LCD的引脚
sbit lcden=P0^5;
sbit lcdwrite=P0^6;
sbit lcdrs=P0^7;
//延时程序
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//lcd的写指令
void write_com(uchar com)
{
lcdrs=0;
lcden=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//lcd的写数据
void write_data(uchar da)
{
lcdrs=1;
lcden=0;
P2=da;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//初始化
void Lcd_init()
{
lcdwrite=0;
lcden=0;
write_com(0x38); //16*2显示,5*7点阵,8位数据
write_com(0x0c);//显示开,关光标
write_com(0x06); //移动光标
write_com(0x01);//清除LCD的显示内容
}
//LCD定义结束
//计算频率值
void calc()
{
uchar i;
long frequency;
frequency=(T0count*256+TH0)*256+TL0;
for(i=7;i>0;i--)
{
disp[i]=frequency%10;
frequency=frequency/10;
}
disp[0]=frequency;
}
void init()
{
T0count=0;
T1count=0;
TH0=0;
TL0=0;
}
void main()
{
uchar dis;
init();
Lcd_init();
TMOD=0x15;
TH1=(65536-5*110592/12)/256;
TL1=(65536-5*110592/12)/256%10;
ET1=1;
ET0=1;
EA=1;
TR1=1;
TR0=1;
//以下四句的作用是在P1.1引脚上形成1000Hz的脉冲,用导线连接到P3.4作为测试用。将其中
//高8位和低8位的初始值更改后可输出不同频率的脉冲。
T2MOD = 0x02;
TH2=255-x[ky];
TL2=255-x[ky];
ET2=1;
EX0=1;
TR2=1;
L1=1;
write_com(0x80);
for(dis=0;dis<12;dis++)
write_data(FreStr[dis]);
while(1)
{
write_com(0xC0);
for(dis=0;dis<8;dis++)
write_data(disp[dis]+0x30); //显示频率
}
}
//计算输入脉冲的次数
void time0() interrupt 1
{
T0count++;
}
//计算1s时间
void time1() interrupt 3
{
TH1=(65536-5*110592/12)/256;
TL1=(65536-5*110592/12)/256%10;
if(T1count==20)
{
calc();
init();
}
else T1count++;
}
//这是产生SPWM波形、
void M() interrupt 5
{
TH2=255-x[ky];
TL2=255-x[ky];
kc++;
if(kc==count)
{
kc=0;
L1=~L1;
ky++;
if(ky==49) ky=0;
}
}
//这是使用外部中断0可以调整输出波形的频率
void MM() interrupt 0
{
delayms(300);
if(INT0==0)
{
count=count-5;
if(count==0) count=255;
}
}
❾ 单片机产生spwm波详解
这个型号的单片机我没用过,我主要应用dsp,在dsp里面是利用pwm模块产生的pwm,有好几种模式,相差多少度都可以设置,你有空的时候看看单片机的这一部分就行,没有pwm功能的话就利用普通定时器也是可以产生的,利用里面的比较中断控制普通io就可以PWM可以用定时器产生,相位的话,你用两个引脚,P1.0 P1.1 在一个周期内轮换输出PWM,P1.0输出PWM则P1.1输出低电平,P1.1输出PWM则P1.0输出低电平,这里有一篇文章挺好http://wenku..com/view/61592b6c1eb91a37f1115c1e.html 思路有了,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; stc12c5608ad单片机有硬件PWM功能,只要在主程序里按正弦规律改变输出脉冲的占空比即可,可将正弦波分成50个时间段,每个时间段是20ms/500=400us,用定时器定时400us改变一次CCAP1L的值(该值除以256即是占空比)即可,CCAP1L的值可以在程序中用三角函数计算,也可以事先计算好存入数组中.
❿ 用89c52单片机如何产生SPWM信号
这是一个复杂的课题,你可以上网搜索“SPWM 逆变” 关键字。逆变是通过CMOS或者BJT开关的打开和闭合来实现的,单片机产生SPWM波,控制CMOS开关的打开闭合,从而达到逆变的目的,先了解SPWM控制逆变的原理,然后找别人发布的程序修改,多调试调试就好了,确认挺复杂的