|
本帖最后由 DebugLab 于 2024-10-13 22:21 编辑
#include "config.h"
#define PCA_T1US (MAIN_Fosc / 12 / 1000000) // 1us 12分频
#define PWM_DUTY (20000*PCA_T1US) // 20ms
u16 g_pwm_tmps[3];
u16 g_pwm_highs[3]={PCA_T1US*500, PCA_T1US*2500, PCA_T1US*500};
u16 g_pwm_lows[3]={PWM_DUTY-PCA_T1US*500, PWM_DUTY-PCA_T1US*2500, PWM_DUTY-PCA_T1US*500};
void PCA_Init(void)
{
CCON = 0x00;
CMOD = 0x00; //PCA时钟为系统时钟12分频
CL = 0x00;
CH = 0x00;
CCAPM0 = 0x4d; //PCA模块0为16位定时器模式并使能脉冲输出
g_pwm_tmps[0 = PCA_T1US*500;
CCAP0L = g_pwm_tmps[0];
CCAP0H = g_pwm_tmps[0 >> 8;
g_pwm_tmps[0 += PCA_T1US*500;
CCAPM1 = 0x4d; //PCA模块0为16位定时器模式并使能脉冲输出
g_pwm_tmps[1 = PCA_T1US*500;
CCAP1L = g_pwm_tmps[1];
CCAP1H = g_pwm_tmps[1 >> 8;
g_pwm_tmps[1 += PCA_T1US*500;
CCAPM2 = 0x4d;
g_pwm_tmps[2 = PCA_T1US*500;
CCAP2L = g_pwm_tmps[2];
CCAP2H = g_pwm_tmps[2 >> 8;
g_pwm_tmps[2 += PCA_T1US*500;
CR = 1; //启动PCA计时器
}
void PCA_Isr() interrupt 7
{
if(CCF0) {
CCF0 = 0;
if(P32) g_pwm_tmps[0 += g_pwm_highs[0];
else g_pwm_tmps[0 += g_pwm_lows[0];
CCAP0L = g_pwm_tmps[0];
CCAP0H = g_pwm_tmps[0 >> 8;
}
if(CCF1) {
CCF1 = 0;
if(P33) g_pwm_tmps[1 += g_pwm_highs[1];
else g_pwm_tmps[1 += g_pwm_lows[1];
CCAP1L = g_pwm_tmps[1];
CCAP1H = g_pwm_tmps[1 >> 8;
}
if(CCF2) {
CCF2 = 0;
if(P54) g_pwm_tmps[2 += g_pwm_highs[2];
else g_pwm_tmps[2 += g_pwm_lows[2];
CCAP2L = g_pwm_tmps[2];
CCAP2H = g_pwm_tmps[2 >> 8;
}
if(CF) CF = 0;
}
void delay_ms(unsigned char ms)
{
unsigned int i;
do{
i = MAIN_Fosc / 1000;
while(--i);
}while(--ms);
}
void main()
{
P3M0 = 0x00;
P3M1 = 0x00;
P5M0 &= ~0x10; P5M1 &= ~0x10;
delay_ms(100);
PCA_Init();
EA = 1;
// CR = 0;
// g_pwm_highs[0] = 3000*PCA_T1US;
// g_pwm_lows[0] = PWM_DUTY-g_pwm_highs[0];
// g_pwm_highs[1] = 500*PCA_T1US;
// g_pwm_lows[1] = PWM_DUTY-g_pwm_highs[1];
// g_pwm_highs[2] = 4000*PCA_T1US;
// g_pwm_lows[2] = PWM_DUTY-g_pwm_highs[2];
// CR = 1;
while (1);
}
|
-
|