首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

【求助】一个充电器程序

【求助】一个充电器程序

请各位大侠帮助,小弟用MC68HC908QY4单片机做了一个对铅酸蓄电池充电的充电器。 没接上充电器时,用划线变阻器模拟电流大小,PWM脉宽可以自动调节。但接上蓄电池就没反应了。请各位高手帮我看看,非常感谢! 程序如下: #include /* for EnableInterrupts macro */ #include /* include peripheral declarations */ #define COMPINPUT 137 /*27v 输入电压采样比较值下限*/ #define COMPOUTPUTV1 100 /*输出电压采样比较值下限21.6V*/ #define COMPOUTPUTV2 112 /*输出电压采样比较值24V */ #define COMPOUTPUTV4 138 /*输出电压采样比较值上限27.6V*/ #define COMPOUTPUTI1 51 /*51电流采样1A*/ #define COMPOUTPUTI2 154 /*电流采样比较值3A*/ uchar AD_INDEX; // AD采样数据保存数组索引 uint AD_AVG[3]; // 四个通道采样数据平均值 uint AD_DATA[10]; // AD采样保存数据 volatile uchar pwmw; enum AD_CHN {AD_NONE, // AD采样通道,对应于输入电压采样,输出电压采样,输出电流采样 AD_INPUT = 0x02, AD_OUTPUTV = 0x03, AD_OUTPUTI = 0x01, } AD_CHANNEL; //延时 void delay(uint time){ uint i; for(i=0;i; } // 计算并保存采样平均值 switch (AD_CHANNEL) { case AD_INPUT: AD_AVG[0] = nData / AD_INDEX; break; case AD_OUTPUTV: AD_AVG[1] = nData / AD_INDEX; break; case AD_OUTPUTI: AD_AVG[2] = nData / AD_INDEX; break; default: break; } } // 如果某一通道采样数据已满,切换通道,数组索引清零。 if (AD_INDEX >= 10) { AD_INDEX = 0; switch (AD_CHANNEL) { case AD_INPUT: AD_CHANNEL = AD_OUTPUTV; break; case AD_OUTPUTV: AD_CHANNEL = AD_OUTPUTI; break; case AD_OUTPUTI: AD_CHANNEL = AD_INPUT; break; default: AD_CHANNEL = AD_INPUT; break; } } ADSCR = (uchar)AD_CHANNEL; // 开始进行AD转换 } }; void control (void){ int i; for(i=0;i<30;++i){ //3个通道各采样10次 scan_adc(); delay(160); } if(AD_AVG[0]>=COMPINPUT){ //如果输入电压大于27V,则充电 if(AD_AVG[1]=(COMPOUTPUTI1-10)&&AD_AVG[2]<=(COMPOUTPUTI1+10)){ charge_on(pwmw); }else{ TSC = 0x30; charge_on(--pwmw); } }else if(AD_AVG[1]>= COMPOUTPUTV2&&AD_AVG[1]<= COMPOUTPUTV4{//大于24V,用3A电流充 if(AD_AVG[2]<(COMPOUTPUTI2-10)){ TSC = 0x30; charge_on(++pwmw); }else if(AD_AVG[2]>=(COMPOUTPUTI2-10)&&AD_AVG[2]<=(COMPOUTPUTI2+10)){ charge_on(pwmw); }else{ TSC = 0x30; charge_on(--pwmw); } }else charge_off(); }else { charge_off(); } }; void main (void) { int i; pwmw=0; CONFIG1_COPD=1; /*禁止开门狗*/ CONFIG2=0x00; /*选用内部振荡器*/ //ADC初始化 ADICLK=0x40 ; /*内部总线时钟3.2M,4分频,ADC转换频率为0.8M*/ AD_INDEX = 0; for(i=0;i<3;i++) AD_AVG=0; for(i=0;i<10;i++) AD_DATA=0; AD_CHANNEL = AD_INPUT; ADSCR = (uchar)AD_CHANNEL; PTA=0x00; /*A口初始化*/ DDRA=0x01; /*A口方向寄存器定义输入输出*/ TMODH = 0x00; TMODL = 0x00; TSC = 0x30; TCH0H=0x00; TCH0L=0x00; for(;;){ control(); } }
返回列表