⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pca-pwm.c

📁 Keil c51 V7.20破解版本.rar
💻 C
字号:
/*------------------------------------------------
Configure PCA in PWM Mode.
Mode0 - Stop
Mode1 - 8-bit fixed frequency PWM
Mode2 - 8-bit variant frequency PWM
Mode3 - 16-bit fixed frequency PWM
------------------------------------------------*/

#include "upsd3300.h"


#define TCM_MODE_STOP_ALL       0x00
#define TCM_MODE_CAPTURE_PE     0x20
#define TCM_MODE_CAPTURE_NE     0x10
#define TCM_MODE_MATCH          0x08
#define TCM_MODE_TOGGLE         0x04
#define TCM_MODE_EINTF          0x80

// Select PCA Counter 0
#define CCONx                   CCON3
#define PCACONx                 PCACON1
#define PCACLx                  PCACL1
#define PCACHx                  PCACH1
#define PWMFx                   PWMF1

// Select TCM0
#define TCMMODEx                TCMMODE5
#define CAPCOMHx                CAPCOMH5
#define CAPCOMLx                CAPCOML5


#define PWM_MODE1_DUTY_CYCLE    0x01        // 0x80 out of 0x100, negative width
#define PWM_MODE2_DUTY_CYCLE    0x07        // 0x40 of 0x100
#define PWM_MODE2_FREQ_RATIO    0x06        // 0x80 of 0x100
#define PWM_MODE3_DUTY_CYCLE    0x0000      // 0x8000 out of 0x10000

/*
void Timer0_Mode2_Init()
// Mode2 - 8-bit autoload
// freq = Fosc/12/(256-TH0)
{
    //1. Set timer operating mode: Timer, mode2
    TMOD=0x02;
    //2. Set TH0, value for auto-reloading.
    TH0=0xff;
    //3. Start Timer0
    TCON|=0x10;
}
*/

void PWM_Mode1_Init(unsigned char channel, unsigned char duty_cycle)
{
    switch(channel)
    {
    case 0:
        P4SFS0|=0x01;
        P4SFS1&=0xFE;
        PCACL0=PCACH0=0x00;
        CCON2=0x10;
        PCACON0=0x00;
        TCMMODE0=0x41;      //CAPCOML0=CAPCOMH0=duty_cycle;
        CAPCOMH0=duty_cycle;
        PCACON0|=0x40;
    break;
    case 1:

    break;
    }
}

/*
void PWM_Mode2_Init()
{
    // ------------- Mode 2 ---------------
    //0.1 Configure pins as PCA function
    P4SFS0=0xff;
    P4SFS1=0;
    //0.2 initialize PCA0 counter
    PCACLx=PCACHx=0;
    //1.1 set PCA0CLK frequency - {prescalar, Enable}
    CCONx=0x10;
    //1.2 select PCA0CLK as PCA0 clock source
    //2. Configure PCA0 Counter - {Idle mode}
    PCACONx=0x00;
    //3. Set duty for TCM0
    PWMFx=PWM_MODE2_FREQ_RATIO;
    CAPCOMLx=CAPCOMHx=PWM_MODE2_DUTY_CYCLE;
    //4. Set TCM0 operating mode
    TCMMODEx=0x42;
    //5. Start PCA0 counter
    PCACONx|=0x40;
}

void PWM_Mode3_Init(unsigned char channel, unsigned int duty_cycle)
{
    switch(channel)
    {
    case 0:
        P4SFS0|=0x01;
        P4SFS1&=0xFE;
        PCACL0=PCACH0=0x00;
        CCON2=0x10;
        PCACON0=0x00;
        CAPCOML0=duty_cycle&0x00ff; // write to CAPCOMLx and pause counter.
        CAPCOMH0=duty_cycle>>8;     // write to CAPCOMLx and resume counter.
        TCMMODE0=0x43;
        PCACON0|=0x40;
    break;
    case 1:

    break;
    }
}
*/
/*
void PWM_Synchronize()
{
    // ------------- Mode 1 ---------------

    //0.1 Configure pins as PCA function
    P4SFS0=0xff;
    P4SFS1=0;

    {//configure PCA0
    //0.2 initialize PCA0 counter
    PCACL0=PCACH0=0x00;
    //1.1 set PCA0CLK frequency
    CCON2=0x10;
    //1.2 select PCA0CLK as PCA0 clock source
    //2. Configure PCA0 Counter operating Mode
    PCACON0=0x00;
    //3. Set TCM0 operationg mode
    TCMMODE0=0x41;
    //4. Set duty for TCM0
    CAPCOML0=CAPCOMH0=PWM_MODE1_DUTY_CYCLE;
    }

    {//configure PCA1
    //0.2 initialize PCA1 counter
    PCACL1=PCACH1=PWM_MODE1_DUTY_CYCLE;
    //1.1 set PCA0CLK frequency
    CCON3=0x10;
    //1.2 select PCA0CLK as PCA0 clock source
    //2. Configure PCA0 Counter operating mode
    PCACON1=0x00;
    //3. Set TCM0 operationg mode
    TCMMODE3=0x41;
    //4. Set duty for TCM0
    CAPCOML3=CAPCOMH3=PWM_MODE1_DUTY_CYCLE;
    }
    //5. Start both PCA simutaniously.
    PCACON0|=0x80;

}
*/
/*
void PwmInit_Mode1(unsigned char PwmDuty_Mode1)
{
    // ----------- Mode 1 --------------
    //0.1 Configure pins as PCA function
    P4SFS0=0xff;
    P4SFS1=0;
    //0.2 initialize PCA0 counter
    PCACL0=PCACH0=0;

    //1.1 set PCA0CLK frequency
    CCON0=0x10;
    //1.2 select PCA0CLK as PCA0 clock source
    //2. Configure PCA0 Counter operating mode
    PCACON0=0x00;
    //3. Set TCM0 operationg mode
    TCMMODE0=0x41;
    //4. Set duty for TCM0
    CAPCOML0=CAPCOMH0=PwmDuty_Mode1;
    //5. Start PCA0 counter
    PCACON0|=0x40;
}


void PwmSetDuty_Mode1(unsigned char PwmDuty_Mode1)
{
    CAPCOMH0=PwmDuty_Mode1;
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -