久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

如何用stc15f60s2芯片的庫函數(shù)pca模塊輸出pwm波?

[復(fù)制鏈接]
ID:220741 發(fā)表于 2017-7-24 08:38 | 顯示全部樓層 |閱讀模式
如何用stc15f60s2芯片的庫函數(shù)pca模塊輸出pwm波?

相關(guān)帖子

回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2017-7-24 10:43 | 顯示全部樓層
研讀“庫函數(shù)pca”并確認是不是可行。或改進。
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2017-7-24 10:52 | 顯示全部樓層
直接用STC-ISP自帶的范例程序
無標題1111.jpg

回復(fù)

使用道具 舉報

ID:220741 發(fā)表于 2017-7-24 11:33 | 顯示全部樓層
利用下面這個庫函數(shù)輸出pwm波控制電機和舵機轉(zhuǎn)向
#include        "PCA.h"

bit                B_Capture0,B_Capture1,B_Capture2;
u8                PCA0_mode,PCA1_mode,PCA2_mode;
u16                CCAP0_tmp,PCA_Timer0;
u16                CCAP1_tmp,PCA_Timer1;
u16                CCAP2_tmp,PCA_Timer2;

/*************        功能說明        **************


******************************************/

u16        PWM0_low;        //PWM輸出低電平的PCA時鐘脈沖個數(shù), 用戶層不可見。
u16        PWM1_low;        //PWM輸出低電平的PCA時鐘脈沖個數(shù), 用戶層不可見。
u16        PWM2_low;        //PWM輸出低電平的PCA時鐘脈沖個數(shù), 用戶層不可見。


//========================================================================
// 函數(shù): void PWMn_SetHighReg(unsigned int high)
// 描述: 更新占空比數(shù)據(jù)。
// 參數(shù): high:
//即PWM輸出高電平的PCA時鐘脈沖個數(shù)。
// 返回: 無
// 版本: VER1.0
// 日期: 2013-5-15
// 備注:
//========================================================================
void PWMn_Update(u8 PCA_id, u16 high)
{
        if(PCA_id == PCA0)
        {
                if(high > PWM0_HIGH_MAX)        high = PWM0_HIGH_MAX;        //如果寫入大于最大占空比數(shù)據(jù),強制為最大占空比。
                if(high < PWM0_HIGH_MIN)        high = PWM0_HIGH_MIN;        //如果寫入小于最小占空比數(shù)據(jù),則返回錯誤代碼2。
                CR = 0;                                                        //停止PCA。
                PCA_Timer0 = high;                                //數(shù)據(jù)在正確范圍,則裝入占空比寄存器。
                PWM0_low = PWM0_DUTY - high;        //計算并保存PWM輸出低電平的PCA時鐘脈沖個數(shù)。
                CR = 1;                                                        //啟動PCA。
        }
        else if(PCA_id == PCA1)
        {
                if(high > PWM1_HIGH_MAX)        high = PWM1_HIGH_MAX;        //如果寫入大于最大占空比數(shù)據(jù),強制為最大占空比。
                if(high < PWM1_HIGH_MIN)        high = PWM1_HIGH_MIN;        //如果寫入小于最小占空比數(shù)據(jù),則返回錯誤代碼2。
                CR = 0;                                                        //停止PCA。
                PCA_Timer1 = high;                                //數(shù)據(jù)在正確范圍,則裝入占空比寄存器。
                PWM1_low = PWM1_DUTY - high;        //計算并保存PWM輸出低電平的PCA時鐘脈沖個數(shù)。
                CR = 1;                                                        //啟動PCA。
        }
        else if(PCA_id == PCA2)
        {
                if(high > PWM2_HIGH_MAX)                high = PWM2_HIGH_MAX;        //如果寫入大于最大占空比數(shù)據(jù),強制為最大占空比。
                if(high < PWM2_HIGH_MIN)                high = PWM2_HIGH_MIN;        //如果寫入小于最小占空比數(shù)據(jù),則返回錯誤代碼2。
                CR = 0;                                                //停止PCA。
                PCA_Timer2 = high;                                                //數(shù)據(jù)在正確范圍,則裝入占空比寄存器。
                PWM2_low = PWM2_DUTY - high;                                //計算并保存PWM輸出低電平的PCA時鐘脈沖個數(shù)。
                CR = 1;                                                //啟動PCA。
        }
}



//========================================================================
// 函數(shù): UpdatePwm(u8 PCA_id, u8 pwm_value)
// 描述: 更新PWM值.
// 參數(shù): PCA_id: PCA序號. 取值 PCA0,PCA1,PCA2,PCA_Counter
//                 pwm_value: pwm值, 這個值是輸出低電平的時間.
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
/*
void        UpdatePwm(u8 PCA_id, u8 pwm_value)
{
        if(PCA_id == PCA0)                CCAP0H = pwm_value;
        else if(PCA_id == PCA1)        CCAP1H = pwm_value;
        else if(PCA_id == PCA2)        CCAP2H = pwm_value;
}
*/

//========================================================================
// 函數(shù): void        PCA_Init(PCA_id, PCA_InitTypeDef *PCAx)
// 描述: PCA初始化程序.
// 參數(shù): PCA_id: PCA序號. 取值 PCA0,PCA1,PCA2,PCA_Counter
//                 PCAx: 結(jié)構(gòu)參數(shù),請參考PCA.h里的定義.
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
void        PCA_Init(u8 PCA_id, PCA_InitTypeDef *PCAx)
{
        if(PCA_id > PCA_Counter)        return;                //id錯誤

        if(PCA_id == PCA_Counter)                        //設(shè)置公用Counter
        {
                CR = 0;
                CH = 0;
                CL = 0;
                AUXR1 = (AUXR1 & ~(3<<4)) | PCAx->PCA_IoUse;                        //切換IO口
                CMOD  = (CMOD  & ~(7<<1)) | PCAx->PCA_Clock;                        //選擇時鐘源
                CMOD  = (CMOD  & ~1) | (PCAx->PCA_Interrupt_Mode & 1);        //ECF
                if(PCAx->PCA_Polity == PolityHigh)                PPCA = 1;        //高優(yōu)先級中斷
                else                                                                        PPCA = 0;        //低優(yōu)先級中斷
                if(PCAx->PCA_RUN == ENABLE) CR = 1;
                return;
        }

        PCAx->PCA_Interrupt_Mode &= (3<<4) + 1;
        if(PCAx->PCA_Mode >= PCA_Mode_SoftTimer)        PCAx->PCA_Interrupt_Mode &= ~(3<<4);

        if(PCA_id == PCA0)
        {
                CCAPM0    = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode;        //工作模式, 中斷模式
                PCA_PWM0  = (PCA_PWM0 & ~(3<<6)) | PCAx->PCA_PWM_Wide;        //PWM寬度

                PCA_Timer0 = PCAx->PCA_Value;
                B_Capture0 = 0;
                PCA0_mode = PCAx->PCA_Mode;
                CCAP0_tmp = PCA_Timer0;
                CCAP0L = (u8)CCAP0_tmp;                        //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
                CCAP0H = (u8)(CCAP0_tmp >> 8);        //后寫CCAP0H
        }
        if(PCA_id == PCA1)
        {
                CCAPM1    = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode;
                PCA_PWM1  = (PCA_PWM1 & ~(3<<6)) | PCAx->PCA_PWM_Wide;

                PCA_Timer1 = PCAx->PCA_Value;
                B_Capture1 = 0;
                PCA1_mode = PCAx->PCA_Mode;
                CCAP1_tmp = PCA_Timer1;
                CCAP1L = (u8)CCAP1_tmp;                        //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
                CCAP1H = (u8)(CCAP1_tmp >> 8);        //后寫CCAP0H
        }
        if(PCA_id == PCA2)
        {
                CCAPM2    = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode;
                PCA_PWM2  = (PCA_PWM2 & ~(3<<6)) | PCAx->PCA_PWM_Wide;

                PCA_Timer2 = PCAx->PCA_Value;
                B_Capture2 = 0;
                PCA2_mode = PCAx->PCA_Mode;
                CCAP2_tmp = PCA_Timer2;
                CCAP2L = (u8)CCAP2_tmp;                        //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
                CCAP2H = (u8)(CCAP2_tmp >> 8);        //后寫CCAP0H
        }
}


//========================================================================
// 函數(shù): void        PCA_Handler (void) interrupt PCA_VECTOR
// 描述: PCA中斷處理程序.
// 參數(shù): None
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
void        PCA_Handler (void) interrupt PCA_VECTOR
{
        if(CCF0)                //PCA模塊0中斷
        {
                CCF0 = 0;                //清PCA模塊0中斷標志
                if(P25)        CCAP0_tmp += PCA_Timer0;        //輸出為高電平,則給影射寄存器裝載高電平時間長度
                else        CCAP0_tmp += PWM0_low;        //輸出為低電平,則給影射寄存器裝載低電平時間長度
                CCAP0L = (u8)CCAP0_tmp;                        //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
                CCAP0H = (u8)(CCAP0_tmp >> 8);        //后寫CCAP0H
        }

        if(CCF1)        //PCA模塊1中斷
        {
                CCF1 = 0;                //清PCA模塊1中斷標志
                if(P26)        CCAP1_tmp += PCA_Timer1;        //輸出為高電平,則給影射寄存器裝載高電平時間長度
                else        CCAP1_tmp += PWM1_low;        //輸出為低電平,則給影射寄存器裝載低電平時間長度
                CCAP1L = (u8)CCAP1_tmp;                        //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
                CCAP1H = (u8)(CCAP1_tmp >> 8);        //后寫CCAP0H
        }

        if(CCF2)        //PCA模塊2中斷
        {
                CCF2 = 0;                //清PCA模塊1中斷標志
                if(P27)        CCAP2_tmp += PCA_Timer2;        //輸出為高電平,則給影射寄存器裝載高電平時間長度
                else        CCAP2_tmp += PWM2_low;        //輸出為低電平,則給影射寄存器裝載低電平時間長度
                CCAP2L = (u8)CCAP2_tmp;                        //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
                CCAP2H = (u8)(CCAP2_tmp >> 8);        //后寫CCAP0H
        }

/*        if(CF)        //PCA溢出中斷
        {
                CF = 0;                        //清PCA溢出中斷標志
        }
*/
}
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天干天天想 | 国产一区二区精品在线观看 | av中文字幕在线观看 | 天堂一区二区三区 | 日韩欧美一区在线 | 欧美日韩在线电影 | 欧美高清dvd | 久草在线 | 久久久精品一区二区 | 国产黄色在线 | 妖精视频一区二区三区 | 欧美黄色网| 亚洲精品中文字幕 | 操视频网站 | 国产jizz女人多喷水99 | 久久这里有精品 | 亚洲欧美视频在线观看 | 欧美一区不卡 | 亚洲少妇综合网 | 久久久久久中文字幕 | 99热在这里只有精品 | 亚洲精品在线免费 | 亚洲福利一区 | 一级a爱片久久毛片 | 久久国产精品视频免费看 | 日本黄色的视频 | 国产99视频精品免视看9 | 成人精品免费 | 福利二区| 国产精品国产精品国产专区不片 | 日韩一区二区三区在线 | 一区二区三区不卡视频 | 久久精品视频一区二区 | 亚洲欧美综合精品另类天天更新 | 黄色片在线网站 | 欧美精品一区在线 | 精品一区二区三区在线观看国产 | 亚洲国产成人精品女人久久久 | 欧美影院 | 久久久久一区 | 国产一区二区在线免费观看 |