单片机3V恒压控制
单片机输出PWM占空比控制Q3开关。
在PWM通过高电平期ADC读取VBAT再读取电压ADC_M-电压。对比VBAT与ADC_M-差值是否为3V,小于3V则提高PWM高电平周期,大于3V则降低PWM高电平周期。
单片机过流检测
电机堵塞时,会导致电流上升(正常工作电流两倍以上),单片机了解当前电流的大小。
if( ( TMR1 > 140) && ( TMR1 <= 239 ) ) ///避免打开和关闭瞬间的尖峰 ADC采集速率 44us { ADMDbits.START = 1; // ADC开始检测 while(ADMDbits.EOC==0); // 延迟程序等待转换结束///// R_ADC_DATA_HB = ADD; // 寄存器“R_ADC_DATA_HB”存储VDD的ADC数据位11~4 R_ADC_DATA_LB = 0x0F & ADR; // 寄存器“R_ADC_DATA_LB”bit3~0存储VDD的ADC数据位3~0 ADC_12bit_Data=(R_ADC_DATA_HB<<4)|R_ADC_DATA_LB; // ADC 12bit数据 ADC_i ; // ADC采样次数 ADC_Abergar =ADC_12bit_Data; if(ADC_i == 8) { ///电压检测,数据处理 ADMD = 0x91; ///下一阶段检测恒压 PA1 ADC_VDD_Abergar=ADC_Abergar >> 3; ADC_Abergar = 0; //LED灯处理 if(!User_Flag.System_Stuta_Charge) //不充电 { ///不确定是否有需要添加的变量先不合并 Battery_Voltage(); // 根据ADC值,决定LED灯显示模式 LED_Delay_Show(); // 连续保持5秒相同的模式,才真正显示 LED_Show(); // LED灯显示 } else //充电状态 测试后,电池电量参数增减 { Battery_Voltage(); // 根据ADC值,决定LED灯显示模式 LED_Delay_Show(); // 连续保持5秒相同的模式,才真正显示 LED_Show(); // LED灯显示 ADC_VDD_Abergar -= 5; } delay(200); //等待ADC稳定 ADMDbits.START = 1; // ADC开始检测 while(ADMDbits.EOC==0); ///延迟程序等待转换结束//// } if(ADC_i == 16) { ADMD = 0x90; ///下一阶段检测堵转 PA0 ADC_AIN1_Abergar=ADC_Abergar >> 5; ///先求平均 >>3 在转换为1/4VDD >>2 ADC_Abergar = 0; if(ADC_VDD_Abergar - ADC_AIN1_Abergar <= 956) ///压差小于2.8V { if(PWM_DUTY >= 10 ) { PWM_DUTY = PWM_DUTY - 8; ///占空比寄存器不可读,需要缓冲。 PWM1DUTY = PWM_DUTY; } } else if(ADC_VDD_Abergar - ADC_AIN1_Abergar <= 1010) ///压差小于2.96V { if(PWM_DUTY >= 2) { PWM_DUTY--; PWM1DUTY = PWM_DUTY; } } else if(ADC_VDD_Abergar - ADC_AIN1_Abergar >= 1065) ///压差大于3.12V { if(PWM_DUTY <= 239) { PWM_DUTY = PWM_DUTY 8; PWM1DUTY = PWM_DUTY; } } else if(ADC_VDD_Abergar - ADC_AIN1_Abergar >= 1017) ///压差大于2.98V { if(PWM_DUTY <= 249) { PWM_DUTY ; PWM1DUTY = PWM_DUTY; } } delay(200); //等待ADC稳定 ADMDbits.START = 1; // ADC开始检测 while(ADMDbits.EOC==0); ///延迟程序等待转换结束//// } if(ADC_i == 24) { ADMD = 0x9B; ////下一阶段检测内部电压 ADC_i = 0; ADC_AIN0_Abergar = ADC_Abergar >> 3; ADC_Abergar = 0; if(ADC_AIN0_Abergar >= 341) //大于250MV 2.5A { Locked_Rotor ; // 6MS执行一次 Locked_Rotor_Time_Limit = 0; if(Locked_Rotor >= 500) //大于3s 认为发生了堵转 { Locked_Rotor = 0; T1CR1 = 0X43; // 电机关机,只是不睡觉 Output_Motor_Off; User_Flag.System_Locked_Rotot = 1; } } if(Locked_Rotor_Time_Limit >= 5000) // 如果5s内没有超过3A的则清除 { Locked_Rotor = 0; Locked_Rotor_Time_Limit = 0; } delay(200); //等待ADC稳定 ADMDbits.START = 1; // ADC开始检测 while(ADMDbits.EOC == 0); ///延迟程序等待转换结束//// } }