各位老师好,我仿照一些资料编写的给24V蓄电池充电的程序,目的是当检测到电池两端电压大于20V时,输出的PWM占空比为0.8,PWM输出给MOS管的栅极以控制开关管的导通,主要是每隔0.1秒AD转换检测电池电压,关于检测时刻所查的资料上有句话是:为了提高检测电压的准确性应该在PWM输出为由高到低电平转换时检测.我以下的程序段能否实现这个要求呢?用的型号是PIC16F877A
while (!RC2); // RC2为PWM输出,等高电平出现
while (RC2); // RC2为PWM输出,等低电平出现
TRISC2 = 1; // 禁止RC2(PWM口)输出
V_value=AD_SUB(2);//AN2通道为蓄电池电压检测通道,得到AD转换后的值
TRISC2 = 0; // 允许RC2(PWM口)输出
另外每隔0.1秒检测一次电压这个功能我的程序是否能实现呢?以下是程序。肯请高手们指点!谢谢!
void main(void)
{ init();//IO口、PWM设置、TMR1初始化
while (1)
{
if (timer_tic) //0.1秒计时到
{
timer_tic= 0; //
while (!RC2); // RC2为PWM输出,等高电平出现
while (RC2); // RC2为PWM输出,等低电平出现
TRISC2 = 1; // 禁止RC2(PWM口)输出
V_value=AD_SUB(2);//AN2通道为蓄电池电压检测通道,得到AD转换后的值
TRISC2 = 0; // 允许RC2(PWM口)输出
if(V_value>0x166&&V_value<0x3f2) CCPR1L=0x20; //当电池电压大于20V小于29V时, CCPR1L为0x20,对应占空比为0.8
} // end if timer tic
if (TMR1IF)//
{
TMR1IF = 0;
TMR1H = 0x85;
TMR1L = 0xEE; // 0.1 秒定时
timer_tic = 1; //
}
}
}
unsigned int AD_SUB(char channel)
{ char i;
unsigned int AD_RES;
ADCON0 = AD_SETUP | (channel << 3); //若AD_SETUP=0x81则TAD=32Tosc
// ADCON0 |=(channel<<3); //设置AD转换通道,打开通道
for (i=1;i<5;i++) NOP(); //打开AD通道后延时20us左右
ADGO=1; //开始AD转换
while (ADGO==1); //等待AD转换结束
ADIF=0; //清AD结束标志
AD_RES=0;
AD_RES=ADRESH<<8;
AD_RES|=ADRESL;
return (AD_RES);
} |