標(biāo)題: 請(qǐng)大師們幫幫忙寫(xiě)一個(gè)C語(yǔ)言的STC15W408AS單片機(jī)pwm輸出程序 [打印本頁(yè)]
作者: 紫氣東來(lái) 時(shí)間: 2017-6-17 17:35
標(biāo)題: 請(qǐng)大師們幫幫忙寫(xiě)一個(gè)C語(yǔ)言的STC15W408AS單片機(jī)pwm輸出程序
大師們幫幫忙寫(xiě)一個(gè)C語(yǔ)言的程序
用STC15W408AS單片機(jī)。
一: 從P1.1(CCP0) p1.0 (CCP1)pwm輸出端口輸出兩路頻率20khz相位相反,死區(qū)時(shí)間1.5us
二: 從p3.6 p3.7 端口輸出兩路頻率可調(diào)10hz-130hz。
p3.6脈寬可調(diào)0.1ms-2ms。 P3.7脈寬固定
P1.3 頻率調(diào)節(jié)電位器AD輸入端口
P1.4 脈寬調(diào)節(jié)電位器AD輸入端口
三: P1.2工作指示燈端口
四: P3.2 外部中斷輸入口(低電位有效)
五:P1.5保護(hù)報(bào)警輸出(蜂鳴器)端口 (中斷時(shí)報(bào)警)
六:P1.6散熱風(fēng)扇輸出端口(低電位有效)。受開(kāi)關(guān)控制,開(kāi)關(guān)斷開(kāi)后延時(shí)2分鐘關(guān)閉風(fēng)扇。
七:P1.7開(kāi)關(guān)控制。
按鍵長(zhǎng)按為開(kāi)機(jī),放開(kāi)為關(guān)機(jī)。
頻率輸出端口的工作順序20khz先輸出;100ms后P3.6輸出0.1-2ms,0.1-2ms后P3.7輸出。
在一個(gè)定時(shí)中斷中完成。
作者: yzwzfyz 時(shí)間: 2017-6-18 23:41
是來(lái)布置作業(yè)的,哪位學(xué)生來(lái)做啊。
作者: dzbj 時(shí)間: 2017-6-19 00:14
這東西某一個(gè)寶上300都沒(méi)人愿意接 我也想看看誰(shuí)來(lái)做
作者: 宮本無(wú)三四 時(shí)間: 2017-6-19 10:02
這里喜歡布置作業(yè)的太多了
作者: angmall 時(shí)間: 2018-7-21 07:25
- /*------------------------------------------------------------------*/
- /* --- STC MCU International Limited -------------------------------*/
- /* --- STC 1T Series MCU Programme Demo ----------------------------*/
- /* If you want to use the program or the program referenced in the */
- /* article, please specify in which data and procedures from STC */
- /*------------------------------------------------------------------*/
- /* 本程序經(jīng)過(guò)測(cè)試完全正常, 不提供電話技術(shù)支持, 如不能理解, 請(qǐng)自行補(bǔ)充相關(guān)基礎(chǔ). */
- /*
- 功能: 使用STC內(nèi)帶的PCA做9~16位的PWM。在PWMn.h中選擇是STC12C5201AD系列還是STC12C5A60S2系列。
- 原理說(shuō)明:
- 本示例程序介紹在一些應(yīng)用中所需要的高于8位分辨率的9~16位PWM,而8位的PWM可以直接使用STC的硬件PWM,請(qǐng)參考有關(guān)的的(Datasheet)。
- 本應(yīng)用所需要資源:PCA可編程計(jì)數(shù)器陣列,捕獲寄存器,匹配中斷向量。
- 程序用到兩個(gè)16位變量:
- PWM_high 保存PWM輸出高電平的PCA時(shí)鐘數(shù)。
- PWM_low 保存PWM輸出低電平的PCA時(shí)鐘數(shù)。
- PWM的周期 = PWM_HIGH + PWM_LOW。
- PCA時(shí)鐘源有8種選擇。
- PCA模塊被配置為16位高速輸出方式,當(dāng)PCA計(jì)數(shù)值與捕獲寄存器數(shù)值匹配時(shí),將CCP0輸出取反,同時(shí)發(fā)生比較匹配中斷。
- 比較匹配中斷里判斷高速輸出的電平,如果是高電平,則向捕獲寄存器裝入高電平的PCA時(shí)鐘數(shù)。如果是低電平,則裝入低電平的PCA時(shí)鐘數(shù)。
- 由于中斷處理需要一點(diǎn)時(shí)間,所以輸出的占空比不能到0%或100%,所以對(duì)PWM_high有最小和最大值,中斷處理絕對(duì)時(shí)間大約為100個(gè)SYSCLK。
- 本示例程序的測(cè)試是基于如下假設(shè):
- PCA時(shí)基信號(hào)為系統(tǒng)時(shí)鐘Fosc,PCA中斷優(yōu)先級(jí)為最高。
- 提示:其它中斷服務(wù)開(kāi)銷很長(zhǎng)時(shí)間時(shí),有可能會(huì)影響本程序的正常運(yùn)行。
- 本示例程序用戶可以在"用戶配置宏"中選擇以下參數(shù):
- PCA_IDLE_DISABLE 在IDLE模式是否禁止PCA工作,選擇1: MCU在IDLE模式時(shí)禁止PCA工作, 選擇0: MCU在IDLE模式時(shí)允許PCA工作。
- PCA_SOURCE_SELECT 選擇PCA的基準(zhǔn)時(shí)鐘源,本示例使用系統(tǒng)時(shí)鐘Fosc做PCA時(shí)鐘源。
- PWM_DUTY 定義PWM的周期,數(shù)值為PCA所選擇的時(shí)鐘脈沖個(gè)數(shù),用戶只需要裝載PWM_high,PWM_low是根據(jù)這個(gè)周期計(jì)算出來(lái)的。
- PWM_HIGH_MAX 限制PWM輸出的最大占空比,原因如前所述。如果裝載PWM_high大于此數(shù)值,將返回錯(cuò)誤。
- PWM_HIGH_MIN 限制PWM輸出的最小占空比,原因如前所述。如果裝載PWM_high小于此數(shù)值,將返回錯(cuò)誤。
- */
- #include "reg51.h"
- #define MAIN_Fosc 24576000L //定義時(shí)鐘
- #define PCA_IDLE_DISABLE 0 //1: MCU在IDLE模式時(shí)禁止PCA工作。 0: MCU在IDLE模式時(shí)允許PCA工作。
- #define PCA_SOURCE_SELECT 4 //選擇PCA的基準(zhǔn)時(shí)鐘源。
- //0:系統(tǒng)時(shí)鐘Fosc/12。
- //1:系統(tǒng)時(shí)鐘Fosc/2。
- //2:定時(shí)器0的溢出。
- //3:ECI/P3.4腳的外部時(shí)鐘輸入(最大=Fosc/2)。
- //4:系統(tǒng)時(shí)鐘Fosc。
- //5:系統(tǒng)時(shí)鐘Fosc/4。
- //6:系統(tǒng)時(shí)鐘Fosc/6。
- //7:系統(tǒng)時(shí)鐘Fosc/8。
- #define PWM_DUTY 4096 //定義PWM的周期,數(shù)值為PCA所選擇的時(shí)鐘脈沖個(gè)數(shù)。
- /**********************************************************************************************************/
- sfr P_SW1 = 0xA2; //外設(shè)功能切換寄存器1
- #define CCP_S0 0x10 //P_SW1.4
- #define CCP_S1 0x20 //P_SW1.5
- sfr CCON = 0xD8; //PCA控制寄存器
- sbit CCF0 = CCON^0; //PCA模塊0中斷標(biāo)志
- sbit CCF1 = CCON^1; //PCA模塊1中斷標(biāo)志
- sbit CR = CCON^6; //PCA定時(shí)器運(yùn)行控制位
- sbit CF = CCON^7; //PCA定時(shí)器溢出標(biāo)志
- sfr CMOD = 0xD9; //PCA模式寄存器
- sfr CL = 0xE9; //PCA定時(shí)器低字節(jié)
- sfr CH = 0xF9; //PCA定時(shí)器高字節(jié)
- sfr CCAPM0 = 0xDA; //PCA模塊0模式寄存器
- sfr CCAP0L = 0xEA; //PCA模塊0捕獲寄存器 LOW
- sfr CCAP0H = 0xFA; //PCA模塊0捕獲寄存器 HIGH
- sfr CCAPM1 = 0xDB; //PCA模塊1模式寄存器
- sfr CCAP1L = 0xEB; //PCA模塊1捕獲寄存器 LOW
- sfr CCAP1H = 0xFB; //PCA模塊1捕獲寄存器 HIGH
- sfr CCAPM2 = 0xDC; //PCA模塊2模式寄存器
- sfr CCAP2L = 0xEC; //PCA模塊2捕獲寄存器 LOW
- sfr CCAP2H = 0xFC; //PCA模塊2捕獲寄存器 HIGH
- sfr PCA_PWM0 = 0xf2; //PCA模塊0的PWM寄存器
- sfr PCA_PWM1 = 0xf3; //PCA模塊1的PWM寄存器
- sfr PCA_PWM2 = 0xf4; //PCA模塊2的PWM寄存器
- sfr P1M0 = 0x92;
- sfr P1M1 = 0x91;
- sbit CCP0 = P1^1;
- sbit CCP1 = P1^0;
- #define PWM_HIGH_MAX PWM_DUTY-32 //限制PWM輸出的最大占空比。
- #define PWM_HIGH_MIN 32 //限制PWM輸出的最小占空比。
- /************* 本地變量聲明 **************/
- unsigned int pwm; //定義用戶操作的PWM變量
- /************* 本地函數(shù)聲明 **************/
- void delay_ms(unsigned char ms);
- /**************** 外部函數(shù)聲明和外部變量聲明 *****************/
- extern unsigned int PWM_high; //PWM空比寄存器,即PWM輸出高電平的PCA時(shí)鐘脈沖個(gè)數(shù)(占空比寫(xiě)入變量)。
- void PWMn_SetHighReg(unsigned int high);
- void PWMn_init(unsigned int high);
- /******************** 主函數(shù) **************************/
- //========================================================================
- // 函數(shù): void main(void)
- // 描述: 不斷更新PWM值,用示波器觀察占空比變化。
- // 參數(shù): 無(wú)。
- // 返回: 無(wú)。
- // 版本: VER1.0
- // 日期: 2011-4-11
- // 備注:
- //========================================================================
- void main(void)
- {
- pwm = 1000; //pwm初值
- pwm = PWM_HIGH_MIN; //pwm初值
- PWMn_init(pwm); //初始化pwm
- while (1)
- {
- delay_ms(10); //延時(shí)
- pwm += 10;
- if(pwm >= PWM_HIGH_MAX) pwm = PWM_HIGH_MIN;
- PWMn_SetHighReg(pwm); //更新PWM的占空比
- }
- }
- /**********************************************/
- //========================================================================
- // 函數(shù): void delay_ms(unsigned char ms)
- // 描述: 延時(shí)函數(shù)。
- // 參數(shù): ms,要延時(shí)的ms數(shù).
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2010-12-15
- // 備注:
- //========================================================================
- void delay_ms(unsigned char ms)
- {
- unsigned int i;
- do
- {
- i = MAIN_Fosc / 14000L; //1T
- while(--i) ;
- }while(--ms);
- }
- unsigned int PWM_high; //定義PWM占空比寄存器,即PWM輸出高電平的PCA時(shí)鐘脈沖個(gè)數(shù)(占空比寫(xiě)入變量)。
- unsigned int PWM_low; //定義PWM輸出低電平的PCA時(shí)鐘脈沖個(gè)數(shù)。
- unsigned int CCAP0_tmp; //定義CCAP0重裝載影射寄存器。
- //========================================================================
- // 函數(shù): void PWMn_SetHighReg(unsigned int high)
- // 描述: 寫(xiě)入占空比數(shù)據(jù)。
- // 參數(shù): high: 占空比數(shù)據(jù),即PWM輸出高電平的PCA時(shí)鐘脈沖個(gè)數(shù)。
- // 返回: 無(wú)
- // 版本: VER1.0
- // 日期: 2009-12-30
- // 備注:
- //========================================================================
- void PWMn_SetHighReg(unsigned int high)
- {
- if(high > PWM_HIGH_MAX) high = PWM_HIGH_MAX; //如果寫(xiě)入大于最大占空比數(shù)據(jù),強(qiáng)制為最大占空比。
- if(high < PWM_HIGH_MIN) high = PWM_HIGH_MIN; //如果寫(xiě)入小于最小占空比數(shù)據(jù),則返回錯(cuò)誤代碼2。
- CR = 0; //停止PCA。
- PWM_high = high; //數(shù)據(jù)在正確范圍,則裝入占空比寄存器。
- PWM_low = PWM_DUTY - high; //計(jì)算并保存PWM輸出低電平的PCA時(shí)鐘脈沖個(gè)數(shù)。
- CR = 1; //啟動(dòng)PCA。
- }
- //========================================================================
- // 函數(shù): void PWMn_init(unsigned int high)
- // 描述: 初始化程序。
- // 參數(shù): high: 初始化占空比數(shù)據(jù),即PWM輸出高電平的PCA時(shí)鐘脈沖個(gè)數(shù)。
- // 返回: 無(wú)
- // 版本: VER1.0
- // 日期: 2009-12-30
- // 備注:
- //========================================================================
- void PWMn_init(unsigned int high)
- {
- ACC = P_SW1;
- ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=0
- P_SW1 = ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
- // ACC = P_SW1;
- // ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=1 CCP_S1=0
- // ACC |= CCP_S0; //(P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2)
- // P_SW1 = ACC;
- //
- // ACC = P_SW1;
- // ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=1
- // ACC |= CCP_S1; //(P2.4/ECI_3, P2.5/CCP0_3, P2.6/CCP1_3, P2.7/CCP2_3)
- // P_SW1 = ACC;
- P1M1 &= ~0x02, P1M0 |= 0x02; //CCAP0使用PUSH-PULL輸出模式
- CCON = 0; //清除CF、CR、CCF0、CCF1
- CMOD = (PCA_IDLE_DISABLE << 7) | (PCA_SOURCE_SELECT << 1); //初始化PCA模式寄存器,這兩項(xiàng)在PWMn.h中選擇。
- CCAPM0 = 0x4D; //高速輸出模式,允許比較匹配中斷(ECCF0=1)。
- CL = 0; //清空PCA基本計(jì)數(shù)器。
- CH = 0;
- CCAP0_tmp = 0; //清空CCAP0重裝載影射寄存器。
- PWMn_SetHighReg(high); //初始化占空比數(shù)據(jù)。
- CR = 1; //啟動(dòng)PCA。
- EA = 1; //允許總中斷
- }
- //========================================================================
- // 函數(shù): void PCA_interrupt (void) interrupt 7
- // 描述: PCA中斷服務(wù)程序。
- // 參數(shù): 無(wú)。
- // 返回: 無(wú)。
- // 版本: VER1.0
- // 日期: 2009-12-30
- // 備注:
- //========================================================================
- void PCA_interrupt (void) interrupt 7
- {
- if(CCF0 == 1) //PCA模塊0中斷
- {
- CCF0 = 0; //清PCA模塊0中斷標(biāo)志
- if(CCP0 == 1) CCAP0_tmp += PWM_high; //輸出為高電平,則給影射寄存器裝載高電平時(shí)間長(zhǎng)度
- else CCAP0_tmp += PWM_low; //輸出為低電平,則給影射寄存器裝載低電平時(shí)間長(zhǎng)度
- CCAP0L = (unsigned char)CCAP0_tmp; //將影射寄存器寫(xiě)入捕獲寄存器,先寫(xiě)CCAP0L
- CCAP0H = (unsigned char)(CCAP0_tmp >> 8); //后寫(xiě)CCAP0H
- }
- /*
- else if(CCF1 == 1) //PCA模塊1中斷
- {
- CCF1 = 0; //清PCA模塊1中斷標(biāo)志
- }
- else if(CF == 1) //PCA溢出中斷
- {
- CF = 0; //清PCA溢出中斷標(biāo)志
- }
- */
- }
復(fù)制代碼
作者: bifxv 時(shí)間: 2018-11-19 22:16
我需要的是一: 從P1.1(CCP0) p1.0 (CCP1)pwm輸出端口輸出兩路頻率20khz相位相反,死區(qū)時(shí)間1.5us功能 寫(xiě)了一周都沒(méi)成功 用PAC
作者: 丁丁丁丁 時(shí)間: 2018-12-19 11:22
lz弄得怎么樣了?
作者: 明記冷氣 時(shí)間: 2020-12-24 13:37
我看這程序要求有點(diǎn)像逆變器
作者: shineyunze978 時(shí)間: 2021-4-29 02:57
STC提供的標(biāo)準(zhǔn)程序,不修改是不能夠?qū)?yīng)的。
作者: 紫氣東來(lái) 時(shí)間: 2022-12-7 12:26
你可以試試,說(shuō)明非常清楚了。功能對(duì)應(yīng)單片機(jī)端口就可以了
作者: Longan.Wang 時(shí)間: 2022-12-9 15:18
課代表,趕快出來(lái)!!!
作者: coody_sz 時(shí)間: 2022-12-9 16:08
STC15W408AS做不到互補(bǔ)帶死區(qū)的PWM,使用STC8H1K08吧,輕松實(shí)現(xiàn),官方例程即可。
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |