找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1879|回复: 3
收起左侧

stc12C5A60S2 PWM 问题

[复制链接]
ID:254747 发表于 2019-11-20 23:49 | 显示全部楼层 |阅读模式
请问 stc12C5A60S2 单片机的两路PWM波形 占空比是不是 不能独立调节啊
回复

使用道具 举报

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的值即可
回复

使用道具 举报

ID:254747 发表于 2019-12-1 11:02 | 显示全部楼层
谢谢 各位大师的解答 ,  我需要两个独立调节的量来做一个可调电源
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表