专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
请问stm32f302怎么通过检测AD采样的电压低于U1的时候进入睡眠,当高于U2的时候唤醒?
2019-07-14 13:58
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
11208
8
1246
我想通过检测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);
}
}
加载中...
查看其它8个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
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);
}
}
一周热门 更多>