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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2251|回復: 3
打印 上一主題 下一主題
收起左側

stc12C5A60S2 PWM 問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:254747 發表于 2019-11-20 23:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問 stc12C5A60S2 單片機的兩路PWM波形 占空比是不是 不能獨立調節啊
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:25310 發表于 2019-11-21 08:11
可以獨立調節,這個系列的時PCA,關斷時會一起關,但調節PWM是沒問題的。


/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-755-82905966 -------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* 如果要在文章中應用此代碼,請在文章中注明使用了宏晶科技的資料及程序   */
/*---------------------------------------------------------------------*/


#include        <reg52.h>


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

輸出3路9~16位PWM信號。

PWM頻率 = MAIN_Fosc / PWM_DUTY, 假設 MAIN_Fosc = 24MHZ, PWM_DUTY = 6000, 則輸出PWM頻率為4000HZ.

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

/***************************用戶宏定義*******************************************************/
#define         MAIN_Fosc                16000000UL        //定義主時鐘

#define                PWM_DUTY                6000                //定義PWM的周期,數值為PCA所選擇的時鐘脈沖個數。
#define                PWM_HIGH_MIN        80                        //限制PWM輸出的最小占空比, 避免中斷里重裝參數時間不夠。
#define                PWM_HIGH_MAX        (PWM_DUTY - PWM_HIGH_MIN)                //限制PWM輸出的最大占空比。

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

#define        PCA0                        0
#define        PCA1                        1
#define        PCA2                        2
#define        PCA_Counter                3
#define        PCA_P12_P11_P10_P37        (0<<4)
#define        PCA_P34_P35_P36_P37        (1<<4)
#define        PCA_P24_P25_P26_P27        (2<<4)
#define        PCA_Mode_PWM                                0x42
#define        PCA_Mode_Capture                        0
#define        PCA_Mode_SoftTimer                        0x48
#define        PCA_Mode_HighPulseOutput        0x4c
#define        PCA_Clock_1T        (4<<1)
#define        PCA_Clock_2T        (1<<1)
#define        PCA_Clock_4T        (5<<1)
#define        PCA_Clock_6T        (6<<1)
#define        PCA_Clock_8T        (7<<1)
#define        PCA_Clock_12T        (0<<1)
#define        PCA_Clock_Timer0_OF        (2<<1)
#define        PCA_Clock_ECI        (3<<1)
#define        PCA_Rise_Active        (1<<5)
#define        PCA_Fall_Active        (1<<4)
#define        PCA_PWM_8bit        (0<<6)
#define        PCA_PWM_7bit        (1<<6)
#define        PCA_PWM_6bit        (2<<6)

#define                ENABLE                1
#define                DISABLE                0

typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

sfr AUXR1 = 0xA2;
sfr CCON = 0xD8;
sfr CMOD = 0xD9;
sfr CCAPM0 = 0xDA;                //PCA模塊0的工作模式寄存器。
sfr CCAPM1 = 0xDB;                //PCA模塊1的工作模式寄存器。
sfr CCAPM2 = 0xDC;                //PCA模塊2的工作模式寄存器。

sfr CL     = 0xE9;
sfr CCAP0L = 0xEA;                //PCA模塊0的捕捉/比較寄存器低8位。
sfr CCAP1L = 0xEB;                //PCA模塊1的捕捉/比較寄存器低8位。
sfr CCAP2L = 0xEC;                //PCA模塊2的捕捉/比較寄存器低8位。

sfr CH     = 0xF9;
sfr CCAP0H = 0xFA;                //PCA模塊0的捕捉/比較寄存器高8位。
sfr CCAP1H = 0xFB;                //PCA模塊1的捕捉/比較寄存器高8位。
sfr CCAP2H = 0xFC;                //PCA模塊2的捕捉/比較寄存器高8位。

sbit CCF0  = CCON^0;        //PCA 模塊0中斷標志,由硬件置位,必須由軟件清0。
sbit CCF1  = CCON^1;        //PCA 模塊1中斷標志,由硬件置位,必須由軟件清0。
sbit CCF2  = CCON^2;        //PCA 模塊2中斷標志,由硬件置位,必須由軟件清0。
sbit CR    = CCON^6;        //1: 允許PCA計數器計數,0: 禁止計數。
sbit CF    = CCON^7;        //PCA計數器溢出(CH,CL由FFFFH變為0000H)標志。
                        //PCA計數器溢出后由硬件置位,必須由軟件清0。
sbit PPCA  = IP^7;                //PCA 中斷 優先級設定位

sfr P2M1 = 0x95;        //P2M1.n,P2M0.n         =00--->Standard,        01--->push-pull
sfr P2M0 = 0x96;        //                                        =10--->pure input,        11--->open drain

//================================================================

sbit        P25 = P2^5;
sbit        P26 = P2^6;
sbit        P27 = P2^7;

u16                CCAP0_tmp,PWM0_high,PWM0_low;
u16                CCAP1_tmp,PWM1_high,PWM1_low;
u16                CCAP2_tmp,PWM2_high,PWM2_low;

u16        pwm0,pwm1,pwm2;

void        PWMn_Update(u8 PCA_id, u16 pwm);
void        PCA_Init(void);
void        delay_ms(u8 ms);

/******************** 主函數 **************************/
void main(void)
{
       
        PCA_Init();        //PCA初始化
        EA = 1;
        //P2M1 &= ~(0xe0);        //P2.7 P2.6 P2.5 設置為推挽輸出
        //P2M0 |=  (0xe0);
       
        while (1)
        {
                delay_ms(2);

                if(++pwm0 >= PWM_HIGH_MAX-10)
           {pwm0 = PWM_HIGH_MIN+10;PWMn_Update(PCA0,pwm0);delay_ms(255);delay_ms(255);}
                PWMn_Update(PCA0,pwm0);

        //        if(++pwm1 >= PWM_HIGH_MAX)        pwm1 = PWM_HIGH_MIN;
        //        PWMn_Update(PCA1,pwm1);

        //        if(++pwm2 >= PWM_HIGH_MAX)        pwm2 = PWM_HIGH_MIN;
        //        PWMn_Update(PCA2,pwm2);
        }
}


//========================================================================
// 函數: void  delay_ms(u8 ms)
// 描述: 延時函數。
// 參數: ms,要延時的ms數, 這里只支持1~255ms. 自動適應主時鐘.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 備注:
//========================================================================
void  delay_ms(u8 ms)
{
     unsigned int i;
         do{
              i = MAIN_Fosc / 13000;
                  while(--i)        ;
     }while(--ms);
}


//========================================================================
// 函數: void PWMn_SetHighReg(unsigned int high)
// 描述: 更新占空比數據。
// 參數: high:         占空比數據,即PWM輸出高電平的PCA時鐘脈沖個數。
// 返回: 無
// 版本: VER1.0
// 日期: 2013-5-15
// 備注:
//========================================================================
void PWMn_Update(u8 PCA_id, u16 pwm)
{
        if(pwm > PWM_HIGH_MAX)        pwm = PWM_HIGH_MAX;        //如果寫入大于最大占空比數據,強制為最大占空比。
        if(pwm < PWM_HIGH_MIN)        pwm = PWM_HIGH_MIN;        //如果寫入小于最小占空比數據,強制為最小占空比。

        if(PCA_id == PCA0)
        {
                CR = 0;                                                //停止PCA一會, 一般不會影響PWM。
                PWM0_high = pwm;                        //數據在正確范圍,則裝入占空比寄存器。
                PWM0_low = PWM_DUTY - pwm;        //計算并保存PWM輸出低電平的PCA時鐘脈沖個數。
                CR = 1;                                                //啟動PCA。
        }
        else if(PCA_id == PCA1)
        {
                CR = 0;                                                //停止PCA。
                PWM1_high = pwm;                        //數據在正確范圍,則裝入占空比寄存器。
                PWM1_low = PWM_DUTY - pwm;        //計算并保存PWM輸出低電平的PCA時鐘脈沖個數。
                CR = 1;                                                //啟動PCA。
        }
        else if(PCA_id == PCA2)
        {
                CR = 0;                                                //停止PCA。
                PWM2_high = pwm;                        //數據在正確范圍,則裝入占空比寄存器。
                PWM2_low = PWM_DUTY - pwm;        //計算并保存PWM輸出低電平的PCA時鐘脈沖個數。
                CR = 1;                                                //啟動PCA。
        }
}

板凳
ID:155507 發表于 2019-11-21 09:13 | 只看該作者
STC12C5A60S2 單片機的兩路PWM波形 占空比是 可以獨立調節的

  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ---------------------------------------------*/
  3. /* --- STC12C5Axx Series MCU PCA module output PWM wave Demo -------*/
  4. /* If you want to use the program or the program referenced in the  */
  5. /* article, please specify in which data and procedures from STC    */
  6. /*------------------------------------------------------------------*/

  7. #include "reg51.h"
  8. #include "intrins.h"

  9. #define FOSC    11059200L

  10. typedef unsigned char BYTE;
  11. typedef unsigned int WORD;

  12. /*Declare SFR associated with the PCA */
  13. sfr CCON        =   0xD8;           //PCA control register
  14. sbit CCF0       =   CCON^0;         //PCA module-0 interrupt flag
  15. sbit CCF1       =   CCON^1;         //PCA module-1 interrupt flag
  16. sbit CR         =   CCON^6;         //PCA timer run control bit
  17. sbit CF         =   CCON^7;         //PCA timer overflow flag
  18. sfr CMOD        =   0xD9;           //PCA mode register
  19. sfr CL          =   0xE9;           //PCA base timer LOW
  20. sfr CH          =   0xF9;           //PCA base timer HIGH
  21. sfr CCAPM0      =   0xDA;           //PCA module-0 mode register
  22. sfr CCAP0L      =   0xEA;           //PCA module-0 capture register LOW
  23. sfr CCAP0H      =   0xFA;           //PCA module-0 capture register HIGH
  24. sfr CCAPM1      =   0xDB;           //PCA module-1 mode register
  25. sfr CCAP1L      =   0xEB;           //PCA module-1 capture register LOW
  26. sfr CCAP1H      =   0xFB;           //PCA module-1 capture register HIGH
  27. sfr PCAPWM0     =   0xf2;
  28. sfr PCAPWM1     =   0xf3;

  29. void main()
  30. {
  31.     CCON = 0;                       //Initial PCA control register
  32.                                     //PCA timer stop running
  33.                                     //Clear CF flag
  34.                                     //Clear all module interrupt flag
  35.     CL = 0;                         //Reset PCA base timer
  36.     CH = 0;
  37.     CMOD = 0x02;                    //Set PCA timer clock source as Fosc/2
  38.                                     //Disable PCA timer overflow interrupt
  39.     CCAP0H = CCAP0L = 0x80;         //PWM0 port output 50% duty cycle square wave
  40.     CCAPM0 = 0x42;                  //PCA module-0 work in 8-bit PWM mode and no PCA interrupt

  41.     CCAP1H = CCAP1L = 0xff;         //PWM1 port output 0% duty cycle square wave
  42.     PCAPWM1 = 0x03;
  43.     CCAPM1 = 0x42;                  //PCA module-1 work in 8-bit PWM mode and no PCA interrupt

  44.     CR = 1;                         //PCA timer start run

  45.     while (1);
  46. }

復制代碼

回復

使用道具 舉報

地板
ID:47286 發表于 2019-11-21 10:34 | 只看該作者
當然可以啊 如"沙發"給的范例 改變CCAPxH和CCAPxL的值即可
回復

使用道具 舉報

5#
ID:254747 發表于 2019-12-1 11:02 | 只看該作者
謝謝 各位大師的解答 ,  我需要兩個獨立調節的量來做一個可調電源
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲a视频 | 亚洲一区二区三区在线 | 国产精品一区二区在线观看 | 国产福利在线播放 | 国产区视频在线观看 | 久久久免费电影 | 日韩成年人视频在线 | 亚洲精品成人在线 | 91精品国产91久久久久青草 | 中文字幕一区二区三区在线乱码 | 亚洲不卡在线视频 | 国产一区二区精品自拍 | 国产免费色 | 久久久久免费观看 | 日韩精品在线一区 | 在线观看国产精品视频 | 综合国产在线 | 亚洲午夜久久久 | 久久久久久高潮国产精品视 | 亚洲成人免费网址 | 三级黄色片在线观看 | 久久激情视频 | 国产一区二区三区免费 | 久艹网站 | 精品久久国产视频 | 国产成人一区二区三区 | 日韩在线观看网站 | 羞羞视频免费观 | 成人在线中文 | 一本一道久久a久久精品蜜桃 | 69精品久久久久久 | 欧美日一区二区 | 成人免费视频在线观看 | 97人人爱| 久久99精品久久久久久 | 日操操夜操操 | 激情一区 | 亚洲精品视频在线播放 | 国产美女一区二区 | 一a一片一级一片啪啪 | 一级做a爰片性色毛片16美国 |