资讯详情

单片机控制3V恒压与过流检测

单片机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); ///延迟程序等待转换结束////     }     }

标签: cr1mt交流功率固态继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台