導航:首頁 > 編程語言 > pwm占空比程序

pwm占空比程序

發布時間:2023-02-12 03:08:21

❶ 關於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);
}
閱讀全文

與pwm占空比程序相關的資料

熱點內容
用bat程序刪除程序 瀏覽:516
dnf鬼泣90版本打安圖恩 瀏覽:668
245倒角編程怎麼計算 瀏覽:599
可以買生活用品的app有哪些 瀏覽:175
cad在c盤產生的文件夾 瀏覽:541
聯想手機解鎖工具 瀏覽:696
瑞銀3887win10 瀏覽:833
學網路編程哪個好 瀏覽:805
手機vmos導入的文件在哪裡 瀏覽:115
蘋果手機可以把文件傳到華為嗎 瀏覽:63
海川化工下載的文件默認到哪裡 瀏覽:343
學唱粵語歌app 瀏覽:975
qq游戲生死狙擊玩不了 瀏覽:120
win10郵件不顯示圖片 瀏覽:922
口袋妖怪所有版本下載 瀏覽:504
我們身邊都有哪些大數據例子 瀏覽:25
震旦adc307掃描的文件在哪裡 瀏覽:999
圖片打開變成文件 瀏覽:194
松下微單電腦傳文件軟體 瀏覽:574
蘋果藍牙鍵盤surface 瀏覽:170

友情鏈接