请问stm32f302怎么通过检测AD采样的电压低于U1的时候进入睡眠,当高于U2的时候唤醒?

2019-07-14 13:58发布

我想通过检测AD采样的电压低于U1的时候进入睡眠,当高于U2的时候唤醒,求高手指点,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
davidliu9518
2019-07-14 21:27
以下是功能实现其中的DMA中断服务函数,你先自己参考参考吧,我最近忙
void DMA1_Channel1_IRQHandler(void)
{
    float Voltage    = 0;                        //电压变量
    float Thermistor = 0;                        //热敏电阻阻值变量
    int   Temp       = 0;                        //热敏电阻测出的温度变量
        
    if(DMA_GetITStatus(DMA1_IT_TC1))
    {   
        //电压采样处理
        Voltage  = g_ADCConvertedValue[2]*3.3/4096;         
        
        #if DEBUG
        /*if(++g_Printf_Count > 300)
        {
            g_Printf_Count = 0;
            printf("Voltage = %f ", Voltage);
        }*/
        #endif   
        
        Voltage *= VOLTAGE_FACTOR;
        Voltage += 0.35;
        if(Voltage < voltage_sill)                //电压值低于阀值
        {
            if(++g_VoltageLow_Count > 10 )         
            {
                g_VoltageLow_Count = 0;
                g_VoltageLow_Flag  = 1;          //设置电压过低的标志
                g_VoltageLow_Flag_backup = 1;    //设置电压过低标志的备份            
            }
            g_VoltRecovery_Count = 0;
        }
        else if(Voltage > voltage_sill + 0.5)
        {                     
            if(g_VoltageLow_Flag_backup)         //电压过低标志的备份置1表示电压曾经过低,现在表示电压恢复
            {
                if(++g_VoltRecovery_Count > 10 )
                {
                    g_VoltRecovery_Count = 0;
                    g_VoltageLow_Flag_backup = 0;
                    g_VoltageLow_Flag = 2;
                }                    
            }
            else
            {
                g_VoltRecovery_Count = 0;
            }
            
            g_VoltageLow_Count = 0;
        }
        else
        {
            g_VoltRecovery_Count = 0;
            g_VoltageLow_Count   = 0;
        }

        //热敏电阻采样处理,根据计算公式可得Rt = R1*U0/(2*U1-U0),
        //或者Rt = R1*U0/(Vcc-U0)     
        if(2*g_ADCConvertedValue[1] > g_ADCConvertedValue[0])
        {            
            Thermistor = (float)(10.0*g_ADCConvertedValue[0]/(2*g_ADCConvertedValue[1]-g_ADCConvertedValue[0]));
            Temp = ThermalLookUp(Thermistor);        //从热敏电阻阻值查表得到相应温度

            if(Temp < HEAT_TEMPERATURE2)             //低于二级温度阀值
            {
                if(++g_ThermalCount > 200)           //当时间超过2秒时,应该设置加热标志
                {
                    g_ThermalCount = 0;
                    g_ThermalHeat_Flag = 2;
                }            
            }
            else if(Temp < HEAT_TEMPERATURE1)
            {
                if(++g_ThermalCount > 200)
                {
                    g_ThermalCount = 0;
                    g_ThermalHeat_Flag = 1;
                }
            }
            else
            {
                g_ThermalCount = 0;
                g_ThermalHeat_Flag = 0;
            }
               
            #if DEBUG
            //if(++g_Printf_Count > 200)
            //{        
            //    g_Printf_Count = 0;            
            //    printf("Vol0 = %f,Vol1 = %f ",g_ADCConvertedValue[0]*3.3/4096,g_ADCConvertedValue[1]*3.3/4096);
            //    printf("Thermistor  = %f ", Thermistor);
            //    printf("Temperature = %d ", Temp);
            //}
            #endif   
        }
        else
        {
            g_ThermalCount = 0;
            g_ThermalHeat_Flag = 0;
        }
        
        DMA_ClearITPendingBit(DMA1_IT_GL1);
    }
}

一周热门 更多>