❶ 關於PWM占空比調節的變成問題,有源程序請教!
遞增,應有極限,不能從0再開始循環。
while(1) {
if(Key1 == 0) //判斷是否K1鍵按下
{
Num++;
Delay10ms(1);
if(Num >= 9)
Num = 9; //我只是改了這一句
PWM_DA_Percent_change( PWM_Data[Num] ); //改變PWM的值
while(Key1 == 0); //等待按鍵抬起
}
}
❷ 51單片機測量PWM波的占空比的C語言程序
用定時器復產生程序如制下:
unsigned
int
a=0
,b=10;
void
main()
{
tmod=0x01;
th0=(65536-50000)/256;
tl0=(65536-50000)%256;
ea=1;
et0=1;
tr0=1;
}
void
pwm()
interrupt
1
{
th0=(65536-50000)/256;
tl0=(65536-50000)%256
;
a++;
p1^1=0;
if(a=20)
{
a=0;
}
if(a=b)
{
p1^1=1;
}
}
調節a
,b的值即可調節占空比,程序框架就是這樣,具體自己改吧
❸ 求單片機輸出占空比可調的PWM波程序
80S52沒有硬體PWM功能,靠
定時器中斷很簡單,只不過頻率不能太高,或調
節精度比較差
下面是雙定時器產生PWM主要語句:
TMOD=0X11;
TH0=(65536-20000)/256;//
定時20ms
TL0=(65536-20000)%256;
TH1=(65536-b)/256;//定時要小於20ms,改變b的值即改變占空比
TL1=(65536-b)%256;
ET0=1;
EA=1;
TR0=1;
PWM=1;
b=2000;
while(1);
void
timer0()interrupt
1
{
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
PWM=1;
TR1=1;
ET1=1;
}
void
timer1()interrupt
3
{
TH1=(65536-b)/256;
TL1=(65536-b)%256;
PWM=0;
TR1=0;
ET1=0;
}
定時器0中斷負責每
20ms將管腳置
1,定時1負責在20ms之內的某一時間將該管腳清0
當然也可以採用自動重裝方式,中斷可以更頻繁一些,產生的PWM頻率要高一些
也可以只用一個定時器,這時產生PWM波要麼頻率低,要麼調節精度差,因中斷一次至少10US,你就不用指望一次調節步距10us以下了
❹ 怎樣用單片機STC 89C52實現pwm控制占空比的輸出波形,求程序!能詳細備注的最好!
PWMHDATA30H;高電平脈沖的個數
PWMDATA31H;PWM周期
COUNTERDATA32H
TEMPDATA33H
ORG0000H
AJMPMAIN
ORG000BH
AJMPINTT0
ORG0100H
MAIN:
MOVSP,#60H;給堆棧指針賦初值
MOVPWMH,#02H;
MOVCOUNTER,#01H
MOVPWM,#15H
MOVTMOD,#02H;定時器0在模式2下工作
MOVTL0,#38H;定時器每200us產生一次溢出
MOVTH0,#38H;自動重裝的值
SETBET0;使能定時器0中斷
SETBEA;使能總中斷
SETBTR0;開始計時
KSCAN:
JNBP1.1,K1CHECK;掃描KEY1,
JNBP1.2,K2CHECK;掃描KEY2,如果按下KEY2,跳轉到KEY2處理程序
SJMPKSCAN
K1CHECK:
JBP1.1,K1HANDLE;去抖動,如果按下KEY1,跳轉到KEY1處理程序
SJMPK1CHECK
K1HANDLE:
MOVA,PWMH
CJNEA,PWM,K1H0;判斷是否到達上邊界
SJMPKSCAN;是,則不進行任何操作
K1H0:
MOVA,PWMH
INCA
CJNEA,PWM,K1H1;如果在加1後到達最大值
CLRTR0;定時器停止
SETBP1.0;P1.0為高電平
SJMPK1H2
K1H1:
CJNEA,#02H,K1H2;如果加1後到達下邊界
SETBTR0;重開定時器
K1H2:
INCPWMH;增加占空比
SJMPKSCAN
K2CHECK:
JBP1.2,K2HANDLE;去抖動,如果按下KEY2,跳轉到KEY2處理程序
SJMPK2CHECK
K2HANDLE:
MOVA,PWMH
CJNEA,#01H,K2H0;判斷是否到達下邊界
SJMPKSCAN;是,則不進行任何操作
K2H0:
MOVA,PWMH
MOVTEMP,PWM
DECA
CJNEA,#01H,K2H1;如果在減1後到達下邊界
CLRTR0;定時器停止
CLRP1.0;P1.0為低電平
SJMPK2H2
K2H1:
DECTEMP
CJNEA,TEMP,K2H2;如果到達上邊界
SETBTR0;啟動定時器
K2H2:
DECPWMH;降低占空比
SJMPKSCAN
INTT0:
PUSHPSW;現場保護
PUSHACC
INCCOUNTER;計數值加1
MOVA,COUNTER
CJNEA,PWMH,INTT01;如果等於高電平脈沖數
CLRP1.0;P1.0變為低電平
INTT01:
CJNEA,PWM,INTT02;如果等於周期數
MOVCOUNTER,#01H;計數器復位
SETBP1.0;P1.0為高電平
INTT02:
POPACC;出棧
POPPSW
RETI
❺ 求MSP430單片機用兩個按鍵控制PWM波占空比的程序!!!!謝謝啦!!!
//程序說明:使用內部內部時鍾fosc/12產生周期為256us,占空比為25%的方波
#include<STC12C5616AD.h>
#define uchar unsigned char
#define uint unsigned int
sbit d1=P1^0;
sbit d2=P1^1;
void PWM_init()
{
CMOD=0x00;//PCA計數脈沖選擇內部時鍾fosc/02(0x02:fosc/2)
CL=0x00;//PCA賦初值
CH=0x00;
}
void PWM0(uchar ZKB)
{
CCAP0L=CCAP0H=ZKB;//255*(100-ZKB)/100;//占空比設置
// =;//255*(100-ZKB)/100;//CL由ff-00溢出時,CCAP0H的值裝入CCAP0L
CCAPM0=0x42;// 8位PWM模式
CR=1; //開始計數
}
void PWM1(uchar ZKB) //高電平佔得比例占空比為(Gao/255)
{
CCAP1H = CCAP1L = ZKB;//256-(int)(256/100)*Gao;
CCAPM1=0x42;// 8位PWM模式
CR=1;
}
void PWM2(uchar ZKB) //高電平佔得比例占空比為(Gao/255)
{
CCAP2H = CCAP2L = ZKB;//256-(int)(256/100)*Gao;
CCAPM2=0x42;// 8位PWM模式
CR=1;
}
void PWM3(uchar ZKB) //高電平佔得比例占空比為(Gao/255)
{
CCAP3H = CCAP3L = ZKB;//256-(int)(256/100)*Gao;
CCAPM3=0x42;// 8位PWM模式
CR=1;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
PWM_init();
while(1)
{
if(d1!=0)
{
PWM0(130);
PWM1(130);
PWM2(255);
PWM3(255);
}
if(d2==1)
{
PWM0(60);
PWM1(255);
PWM2(20);
PWM3(255);
delay(300);
}
i
}
}
若不是新手加上按鍵應該會的
❻ 跪求stc12c5a60s2單片機PWM程序。50%占空比。P1.3口輸出PWM。
#include<STC12C5A60S2.H> //頭文件
/*********************************************************************************************
函數名:PWM初始化函數
調 用:PWM_init();
參 數:無
返回值:無
結 果:將PCA初始化為PWM模式,初始占空比為0
備 註:需要更多路PWM輸出直接插入CCAPnH和CCAPnL即可
/**********************************************************************************************/
void PWM_init (void){
CMOD=0x02; //設置PCA定時器
CL=0x00;
CH=0x00;
CCAPM0=0x42; //PWM0設置PCA工作方式為PWM方式(0100 0010)
CCAP0L=0x00; //設置PWM0初始值與CCAP0H相同
CCAP0H=0x00; // PWM0初始時為0
//CCAPM1=0x42; //PWM1設置PCA工作方式為PWM方式(使用時刪除//)
//CCAP1L=0x00; //設置PWM1初始值與CCAP0H相同
//CCAP1H=0x00; // PWM1初始時為0
//CCAPM2=0x42; //PWM2設置PCA工作方式為PWM方式
//CCAP2L=0x00; //設置PWM2初始值與CCAP0H相同
//CCAP2H=0x00; // PWM2初始時為0
//CCAPM3=0x42; //PWM3設置PCA工作方式為PWM方式
//CCAP3L=0x00; //設置PWM3初始值與CCAP0H相同
//CCAP3H=0x00; // PWM3初始時為0
CR=1; //啟動PCA定時器
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:PWM0占空比設置函數
調 用:PWM0_set();
參 數:0x00~0xFF(亦可用0~255)
返回值:無
結 果:設置PWM模式占空比,為0時全部高電平,為1時全部低電平
備 註:如果需要PWM1的設置函數,只要把CCAP0L和CCAP0H中的0改為1即可
/**********************************************************************************************/
void PWM0_set (unsigned char a){
CCAP0L= a; //設置值直接寫入CCAP0L
CCAP0H= a; //設置值直接寫入CCAP0H
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:主函數
調 用:無
參 數:無
返回值:無
結 果:程序開始處,無限循環
備 註:
/**********************************************************************************************/
void main (void){
while(1){
PWM_init(); //PWM初始化
PWM0_set(0x7F); //設置PWM占空比,總共255,除以2,轉換成十六進製得7F
}
}
/**********************************************************************************************/
❼ 求DSP產生可變占空比PWM波程序
用EVA事件管理器產生 重點看哈那張的內容 占空比有公式計算 自己動手做了才知道是怎麼回事
/****************************************************************************
*
*文件名:EvPwm02.c
*
*功 能:PWM1和PWM2輸出頻率為1KHz的PWM波形。波形的占空比每隔1s變化5%,范圍在10%
* 到90%之間。
*
*說 明:EVA下面的通用定時器T1工作於連續增/減計數模式,產生對稱的PWM波形。通過
* T1的周期中斷來計時,每隔1s鍾改變1次占空比。死區時間為4.27us。
*
****************************************************************************/
#include "DSP28_Device.h"
#include "DSP28_Globalprototypes.h"
Uint32 intcount;
int increase;
int decrease;
/****************************************************************************
*
*名 稱:main()
*
*功 能:初始化系統和各個外設
*
*入口參數:無
*
*出口參數:無
*
****************************************************************************/
void main(void)
{
InitSysCtrl(); //初始化系統函數
DINT;
IER = 0x0000; //禁止CPU中斷
IFR = 0x0000; //清除CPU中斷標志
InitPieCtrl(); //初始化PIE控制寄存器
InitPieVectTable(); //初始化PIE中斷向量表
InitGpio(); //初始化Gpio口
InitEv(); //初始化EV
intcount=0; //T1定時器周期中斷計數器
increase=0; //占空比逐漸變小的變化趨勢標志位
decrease=1; //占空比逐漸變大的變化趨勢標志位
PieCtrl.PIEIER2.bit.INTx4=1; //使能PIE中斷,T1定時器中斷位於INT2.4
IER|=M_INT2;
EINT; //開全局中斷
ERTM; //開實時中斷
EvaRegs.T1CON.bit.TENABLE=1; //使能定時器T1計數操作
while(1)
{
}
}
❽ 求51單片機用三個定時器同時產生3路占空比可調的pwm的程序
一個定時器就能搞定
#include<reg51.h>
#include<INTRINS.h>
#defineu16unsignedint
#defineu8unsignedcharsbitpwm1=P1^0;
sbitpwm2=P1^1;
sbitpwm3=P1^2;
u8jsflag;
u8pwm[3]={0,100,200};//三路pwm的值,范圍為0-200
voidinit() //初始化函數
{TMOD|=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
}
voidmain()//主函數
{
init();
while(1);
}voidtimer0()interrupt1//定時器,100us
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
if(++jsflag>=200)jsflag=0;
pwm1=(jsflag>=pwm[0]?0:1);
pwm2=(jsflag>=pwm[1]?0:1);
pwm3=(jsflag>=pwm[2]?0:1);
}