❶ 關於單片機產生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控制逆變的原理,然後找別人發布的程序修改,多調試調試就好了,確認挺復雜的