u8 xdata RF_Energy = 1; //强度
bit start_RF = 0; //开关
u8 power_Delay_flag =0;
u16 power_Delay_con=0;
u8 xdata CET_MIN= 0; //强度
u8 xdata CET_MAX= 0; //强度
u16 code CET_MIN_Energy_0[21]= {0,176,192,208,224,240,256,272,288,304,320,336,352,368,384,400,416,432,448,464,480}; //RF强度
u16 code CET_MAX_Energy_100[21]={0,512,528,544,560,576,592,608,624,640,656,672,688,704,720,736,752,768,784,800,816};
u16 PWM_DUTY_CCR4 =0;
u16 PWM_DUTY_CCR4_temp =0;
#define PWM_PSC (24-1) //12分频,0.5us 1M 0-65536从0开始计算 0不分频,1:2分频 fck_cnt=fck_psc/(PSCR[15:0]+1 输出频率=时钟/分频 从0开始
#define PWM_PERIOD 999 //周期100us FS/(PSC +1/PWMA_ARR+1)
#define PWM_DUTY 0 //占空10us
void PWMA_ADJ_Config() //ADJ可调
{
PWMA_PS = 0x40; //2.7 4n
PWMA_PSCRH = (u16)(PWM_PSC >> 8);
PWMA_PSCRL = (u16)(PWM_PSC);
PWMA_CCER2 = 0x00; // 写 CCMRx 前必须先清零 CCERx 关闭通道
PWMA_CCMR4 = 0x60; // 设置 CC2 为 PWMA 输出模式,PWM模式1
PWMA_CCER2 = 0x40; // 使能 CC4n
PWMA_CCR4H = (u16)(PWM_DUTY >> 8); //设置占空比
PWMA_CCR4L = (u16)(PWM_DUTY);
PWMA_ARRH = (u16)(PWM_PERIOD >> 8); // 设置PWM周期
PWMA_ARRL = (u16)(PWM_PERIOD);
PWMA_ENO = 0x80; // 使能 PWM4n 端口输出
//PWMA_BKR = 0x80; // 使能主输出
//PWMA_CR1 = 0x01; // 启动PWM定时器
}
void TM26_Isr() interrupt 26 //PWMa更新中断
{
if(PWMA_SR1 & 0x01)
{
PWMA_SR1 &= ~0x01;
PWMA_BKR &= ~0x80; // 使能主输出
PWMA_CR1 &= ~0x01; // 关闭PWM定时器
}
}
void power_Delay() //T0调用 1MS
{
if(power_Delay_flag ==1 && ++power_Delay_con>=1000 )//PWM 停止一秒
{
power_Delay_con=0;
power_Delay_flag =2;
}
else if(power_Delay_flag ==2 && ++power_Delay_con>=200)// 每200MS 加8us
{
power_Delay_con=0;
PWM_DUTY_CCR4_temp += 8;
if(PWM_DUTY_CCR4_temp >=PWM_DUTY_CCR4 )
{
PWM_DUTY_CCR4_temp =0;
power_Delay_flag =0;
PWMA_CCR4H =(u16)(PWM_DUTY_CCR4 >> 8);
PWMA_CCR4L =(u16)(PWM_DUTY_CCR4);
return ;
}
else //保险一点吧
{
PWMA_CCR4H =(u16)(PWM_DUTY_CCR4_temp >> 8);
PWMA_CCR4L =(u16)(PWM_DUTY_CCR4_temp);
PWMA_BKR = 0x80; // 使能主输出
PWMA_CR1 = 0x01; // PWM定时器
}
}
}
void RF_Intensity_add() //强度加 串口接收操作,放在while(1)
{
if(RF_Energy<99)
{
RF_Energy++;
if( 1 == page )
{
if(start_RF)
{
power_Delay_con=0;
PWM_DUTY_CCR4_temp =0;
power_Delay_flag =1;
PWMA_CCR4H =(u16)(0);
PWMA_CCR4L =(u16)(0);
PWMA_IER =0x01; // 更新中断 //问题在这里
}
PWM_DUTY_CCR4 = CET_MIN_Energy_0[CET_MIN]+ ((CET_MAX_Energy_100[CET_MAX] - CET_MIN_Energy_0[CET_MIN] )* RF_Energy / 99 ); //百分比插入
}
}
}
void RF_on() //RF开启-
{
if(!start_RF)
{
start_RF =1;
Time_continued=0;
F_otu =0;
//PWMA_BKR = 0x80; // 使能主输出
// PWMA_CR1 = 0x01; // PWM定时器
power_Delay_flag =1;
}
}
调整强度时,想用PWMA 更新中断,关闭PWMA。
PWMA_CCR4H =(u16)(0);
PWMA_CCR4L =(u16)(0);
这里我的理解是CCR从0开始到ARR。产生更新中断.因为不要能直接停止PWMA使能,需要跑一个或多个空周期。或者使用重复设数器跑几个空的再关闭使能。
我要控制这个,竟然没找到资料。控制开关电源输出电压,PWM转模拟
|