欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9467|回復: 3
收起左側

一個定時器生成多路PWM波形的原理和方法

[復制鏈接]
ID:63113 發表于 2018-3-30 21:16 | 顯示全部樓層 |閱讀模式
在很多工程應用中,需要使用到PWM波(脈寬調制),例如電機調速、溫度控制調整功率等。本文講述怎么利用單片機的一個定時器生成多路PWM波形。
一般的,PWM的周期t1是一個固定值,如1ms,10ms,100ms等,在一個周期中包含了高電平t2和低電平t3,它們的關系是t2+t3=t1。改變一個周期中高電平的時間,就能達到速度或者功率調整的目的。PWM適用于高速開關器件的控制,不適合于繼電器等低速開關元件的控制,因為繼電器等低速元件達不到如此快的開關速度。
PWM控制的關鍵是控制改變PWM的高電平時間t2,這個時間在其他子程序中由控制算法中進行修改,如PID控制算法。
1.JPG
圖 1
在微處理器,如單片機中,實現一個定時器生成多路PWM的方法如下。
首先來看看用一個定時器實現一路PWM輸出的方法:
>>定義一個時間基準刻度t,這個也是計時器中斷周期,一般在程序中t不改變。PWM的周期、高低電平時間由若干個基準時間t組成;
>>定義一個全局計時變量n,n表示這段時間經過了多少個基準時間t;
>>定義一個全局計時變量n1,n1表示一個PWM的周期包含多少個基準時間t,n1=t1/t。一般在程序中n1,t1不改變。
>>定義一個全局計時變量n2,n2表示一個PWM周期中高電平包含多少個基準時間t,n2=t2/t。由于高電平的時間受其他算法控制改變的,n2也是隨時在改變。
程序的流程如下:
①初始化定時器,定時器中斷時間設置為t,如設置t為1ms或其他;
②初始化變量:n=0;//計時變量n清零
n1=t1/t;//一個PWM的周期t1包含了多少個基準時間t.
//假如設PWM周期為100ms,則n1=100;
                  n2=t2/t;//計算一個PWM中高電平時間t2由多少個基準時間//t組成。t2由其他控制算法改變。
③        開始計時,打開定時器中斷。定時器中斷程序中n++;
當n<n2&& n<n1時,IO口輸出高電平;
當n>=n2&& n<n1時,IO口輸出低電平;
當n>n1時,返回步驟①進行下一個周期的PWM.


程序流程圖如下:
2.jpg
圖2
如果在同一個定時器中需要多路PWM,再定義多組類似的變量,按照圖2 中流程處理即可。


更多精彩內容,盡在微信公眾號“永珂在線”
公眾號二維碼 - 小.jpg


回復

使用道具 舉報

ID:296417 發表于 2018-4-13 15:12 | 顯示全部樓層
樓主可以分享代碼嗎?謝謝!
回復

使用道具 舉報

ID:639666 發表于 2019-11-12 07:14 | 顯示全部樓層
很好的思路,贊一個。
回復

使用道具 舉報

ID:609560 發表于 2019-11-12 09:43 | 顯示全部樓層
樓主思路同我常用思路應同
如下復一個流星燈程序參考

#include<reg52.h>
unsigned int led=0x0;
unsigned char Duty_ratio[3]={75,90,98};
unsigned char freq,i,j;
void init(void)
{
        TMOD=0x02;     
        TL0=TH0=0xff-200;  
        TR0=1;                               
        ET0=1;                       
        EA=1;               
}

void timer0(void) interrupt 1
{
        freq++;
}

void PWM(void)
{
        led=0x01;
        for(j=0;j<3;j++)
        {
                led=led<<1;
                if(freq>Duty_ratio[j]) led=led+1;
        }
}

void main(void)
{
        init();
        while(1)
        {
                if (freq>=100)  
                {
                        freq=0;
                        i++;
                        if(i>=90) i=0; //移動速度
                }
                PWM();
                P1=~((led<<(i/5))>>4);
        }
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表