找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 9448|回復(fù): 18
收起左側(cè)

用PWM做呼吸燈

  [復(fù)制鏈接]
ID:55063 發(fā)表于 2013-10-13 10:35 | 顯示全部樓層 |閱讀模式
我要用pwm做呼吸燈,可我對(duì)pwm是怎么編寫的,原理什么的不知道,忘前輩們指教。最好能給我一個(gè)教pwm控制單片機(jī)的視頻教程,我學(xué)一下,謝謝!
由于是新手,表述可能不準(zhǔn)確請(qǐng)見諒。
回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2013-10-13 13:38 | 顯示全部樓層
這里有 呼吸燈的詳細(xì)資料http://www.torrancerestoration.com/mcu/1160.html
回復(fù)

使用道具 舉報(bào)

ID:55946 發(fā)表于 2013-10-15 00:10 | 顯示全部樓層
12系列的PWM輸出
STC12C5A60S2內(nèi)部集成了兩路可編程計(jì)數(shù)器陣列(PCA)可以用做脈寬調(diào)制(PWM)輸出。脈寬調(diào)制是將模擬信號(hào)轉(zhuǎn)換為脈沖波的一種技術(shù)。一般轉(zhuǎn)換后脈波的周期固定,但占空比會(huì)隨模擬信號(hào)的大小而改變。講多了,下面直接講重點(diǎn),如何用C語(yǔ)言實(shí)現(xiàn)PWM輸出。
STC12C5A60S2單片機(jī)通過(guò)程序設(shè)定工作在八位PAM模式,其占空比與PCA_PWMn(n=0,1下同)寄存器的EPCnL和CCAPn L的值有關(guān)。當(dāng)CL的值小于[EPCnL,CCAPn L]時(shí)PWM輸出低電平,大于時(shí)輸出高電平。八位計(jì)數(shù)器CL不斷的從00加一,直到FF再循環(huán),這樣就形成了一定占空比的方波,當(dāng)CL從FF溢出到00時(shí),[EPCnH,CCAPn H]的值自動(dòng)裝載到[EPCnL,CCAPn L]中,我們只要改變[EPCnH,CCAPn H],在下一個(gè)周期就會(huì)形成新的占空比。要想使用PWM功能,要將CCAPMn寄存器的ECOMn和PWMn位置位。CL和CH的初值都為0(八位(256-256)%256和(256-256)/256)。CCAPn H的值等于=255-255*占空比/100。
主要文件
/********************************************************************
* 文件名  :  12系列PWM輸出
* 描述    :  利用12系列自帶的PWM輸出可調(diào)占空比的脈寬 
* 創(chuàng)建人  : 嚴(yán)兵,2013年7月21日
***********************************************************************/
#include "fun.h"   
/********************************************************************
* 名稱 : 外部中斷0服務(wù)函數(shù)
* 功能 : 外部產(chǎn)生中斷時(shí),將占空比值減一
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/                          
void  INT0_interrupt() interrupt 0
{
        if ( duty_level > 0 )
        {
                duty_level --;
                CCAP0H =  255 - 255 * duty[duty_level] / 100;
        }
        else
        {
                duty_level = 10;        //PWM調(diào)到最大,發(fā)光二極管熄滅
                CCAP0H =  255 - 255 * duty[duty_level] / 100;
        }
}

main()
{
        ms_delay(20);
        init_port();
        init_int();       
        init_pca();

        EA = 1;//開總中斷

        while(1);
}
FUN.H頭文件
#include <intrins.h>
#include <reg51.h>        //包含頭文件  

//定義端口寄存器         
sfr P0M0 = 0X93;
sfr P0M1 = 0X94;
sfr P1M0 = 0X91;
sfr P1M1 = 0X92;
sfr P2M0 = 0X95;
sfr P2M1 = 0X96;  
sfr P3M0 = 0Xb1;
sfr P3M1 = 0Xb2;

//與PCA0有關(guān)的寄存器
sfr CCON = 0xd8; //PCA控制寄存器
        sbit CCF0 = CCON^0; //PCA0中斷標(biāo)志位
        sbit CR = CCON^6;        //運(yùn)行控制位
        sbit CF = CCON^7;        //溢出標(biāo)志
sfr CMOD = 0xd9; //PCA工作模式寄存器
sfr CL = 0xe9;
sfr CH = 0xf9;
sfr CCAPM0 = 0xda;//PCA0寄存器  
sfr CCAP0L = 0xea;
sfr CCAP0H = 0xfa;
sfr PCAPWM0 = 0xf2;

#define fosc 11059200L       
sbit s1 = P3^2;

unsigned char duty[11] = {0,10,20,30,40,50,60,70,80,90,100};
unsigned char duty_level;        //占空比值
/********************************************************************
* 名稱 : 外部中斷0初始化函數(shù)
* 功能 : 初始化外部中斷0
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void init_int()
{
        IT0 = 1;//設(shè)置INT0為下降沿觸發(fā)
        EX0 = 1;//允許INT0中斷  
}
/********************************************************************
* 名稱1: I/O初始化函數(shù)
* 功能 : 初始化P1I/O
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void init_port()
{
        P1M1 = 0x00;  //P1.3強(qiáng)推挽輸出
        P1M0 = 0x04;
}
/********************************************************************
* 名稱 : PCA初始化函數(shù)
* 功能 : 設(shè)置PCA模塊0的PWM
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void init_pca()
{
        CCON = 0;         //
        CL = 0;             //(256-256)/256  PCA計(jì)數(shù)器初值設(shè)定,八位PWM模式  
        CH = 0;             //(256-256)%256
        CMOD = 0x08; //0000 1000 時(shí)鐘源為系統(tǒng)時(shí)鐘,得到PWM的頻率(最快) = fosc / 256 = 43.2k,PWM時(shí)PCA計(jì)數(shù)器不需要產(chǎn)生中斷,只要一直計(jì)數(shù)
        duty_level = 0;        //占空比0%
        CCAP0H =  255 - 255 * duty[duty_level] / 100;//根據(jù)PWM占空比算捕獲計(jì)數(shù)值
        CCAP0L =  CCAP0H;        //將高位值(CCAP0H)給低位(CCAP0L),這樣就可以通過(guò)改變高位值來(lái)控制低位值,而占空比是根據(jù)CL和[EECPOL,CCAP0L]比較得來(lái)的
        CCAPM0 = 0x42; //0010 0010 上升沿捕獲,PWM使能
        CR = 1;        //        啟動(dòng)PWM
}
/********************************************************************
* 名稱 : 延時(shí)函數(shù)
* 功能 : 延時(shí)T*MS
* 輸入 : T
* 輸出 : 無(wú)
***********************************************************************/
void ms_delay(unsigned int t)
{
        unsigned  int  i;
        for (t; t > 0; t--)        //外層循環(huán)t次         
                for (i = 1320;i > 0; i--)        //內(nèi)層循環(huán)110*12次        ,12系列比51快12倍          
                ;
}
回復(fù)

使用道具 舉報(bào)

ID:55063 發(fā)表于 2013-10-16 13:37 | 顯示全部樓層
太感謝了
回復(fù)

使用道具 舉報(bào)

ID:63752 發(fā)表于 2014-8-19 12:52 | 顯示全部樓層
太感謝了,學(xué)習(xí)學(xué)習(xí)~~
回復(fù)

使用道具 舉報(bào)

ID:2318 發(fā)表于 2014-8-19 13:10 來(lái)自手機(jī) | 顯示全部樓層
呼吸燈其實(shí)挺簡(jiǎn)單的,,就是慢慢的改變pwm脈沖寬度,達(dá)到讓燈慢慢亮又慢慢暗的效果
回復(fù)

使用道具 舉報(bào)

ID:63752 發(fā)表于 2014-8-22 11:39 | 顯示全部樓層
hkccd 發(fā)表于 2014-8-19 13:10
呼吸燈其實(shí)挺簡(jiǎn)單的,,就是慢慢的改變pwm脈沖寬度,達(dá)到讓燈慢慢亮又慢慢暗的效果

我用PCA模塊做PWM輸出,定時(shí)器中斷,使500MS改變占空比,我要如果設(shè)置?請(qǐng)求助。
回復(fù)

使用道具 舉報(bào)

ID:123712 發(fā)表于 2016-7-16 14:12 | 顯示全部樓層
感謝感謝,學(xué)習(xí)中
回復(fù)

使用道具 舉報(bào)

ID:122633 發(fā)表于 2016-7-22 21:53 | 顯示全部樓層
PWM 脈沖寬度調(diào)制
回復(fù)

使用道具 舉報(bào)

ID:122633 發(fā)表于 2016-7-22 21:58 | 顯示全部樓層
利用處理器的數(shù)字輸出來(lái)控制脈沖寬度
回復(fù)

使用道具 舉報(bào)

ID:111634 發(fā)表于 2016-7-23 12:36 | 顯示全部樓層
呼吸燈的定義是什么?
回復(fù)

使用道具 舉報(bào)

ID:134736 發(fā)表于 2016-7-23 17:24 | 顯示全部樓層
分享一個(gè)Arduino上用與驅(qū)動(dòng)舵機(jī)的PWM輸出:用延時(shí)做的效果可以:

void servopulse(int servopin,int myangle)//定義一個(gè)脈沖函數(shù)
{
pulsewidth=(myangle*11)+500;//將角度轉(zhuǎn)化為500-2480 的脈寬值
digitalWrite(servopin,HIGH);//將舵機(jī)接口電平至高
delayMicroseconds(pulsewidth);//延時(shí)脈寬值的微秒數(shù)
digitalWrite(servopin,LOW);//將舵機(jī)接口電平至低
delay(20-pulsewidth/1000);
}
回復(fù)

使用道具 舉報(bào)

ID:134884 發(fā)表于 2016-7-25 09:03 | 顯示全部樓層
之前做過(guò)一個(gè) 死循環(huán)里面通過(guò)變量大小分配亮和滅的比值  再用定時(shí)器控制比值的變化 就有呼吸燈效果了
回復(fù)

使用道具 舉報(bào)

ID:134903 發(fā)表于 2016-7-25 10:16 | 顯示全部樓層
定時(shí)器
回復(fù)

使用道具 舉報(bào)

ID:134907 發(fā)表于 2016-7-25 11:55 | 顯示全部樓層
Delay(20);
回復(fù)

使用道具 舉報(bào)

ID:134919 發(fā)表于 2016-7-25 12:06 | 顯示全部樓層
PWM 脈沖寬度調(diào)制
回復(fù)

使用道具 舉報(bào)

ID:134697 發(fā)表于 2016-7-25 14:31 | 顯示全部樓層
我也是來(lái)學(xué)習(xí)的,回頭做下實(shí)驗(yàn)。
回復(fù)

使用道具 舉報(bào)

ID:76600 發(fā)表于 2016-7-27 12:09 | 顯示全部樓層
學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:1114752 發(fā)表于 2024-3-30 10:33 | 顯示全部樓層
哈嘍,大佬,現(xiàn)在是2024年,你還在嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表