为什么我STM32使用外接电源模块给传感器供电,传感器检测不到任何数据了?
你外置的电源是多少V的,这个东西功跟供电大小也有关的,可能正好5v,你是要高了可能还会烧掉设备
你先确定到底是传感器没数据了还是你STM32有bug
用万用表量,不要只看程序有没有输出
传感器外置电源与STM32是否共地?传感器外置电源电压多少?
main线程负责初始化
int main(void)
{
// led_init();
button_init();
Pwm_Init();
temp_get_adc_init();
display_init();
rt_kprintf("Hello world!\n");
while (1)
{
rt_thread_delay(500);
}
}
display线程负责oled屏幕的显示
#include "display.h"
#include <oled.h>
static void display_entry(void *parameter)
{
OLED_Clear();
while(1)
{
OLED_ShowString(20,20, "start-up",16,1);
OLED_ShowNum(0,0,(int)((temp*100)/100),2,12,1);
OLED_ShowString(25,0, ".",16,1);
OLED_ShowNum(30,0,(int)(temp*100)%100,2,12,1);
OLED_Refresh();
rt_thread_delay(100);
}
}
rt_thread_t display=RT_NULL;
int display_init(void)
{
OLED_Init();
//创建显示线程 优先级设置为31
display = rt_thread_create("display", display_entry, RT_NULL, 1024, 28, 5);
//启动显示线程
if(RT_NULL != display)
{
rt_thread_startup(display);
// rt_kprintf("display_ok\n");
}
return 0;
}
temp_get_adc线程采集ntc的温度值并换算成摄氏度
rt_thread_t temp_get_adc=RT_NULL;
int temp_get_adc_init(void)
{
rt_err_t ret = RT_EOK;
/* 查找设备 */
adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
if (adc_dev == RT_NULL)
{
rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME);
return RT_ERROR;
}
/* 使能设备 */
ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
/* 关闭通道 */
// ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
//创建温度采集线程
temp_get_adc = rt_thread_create("temp_get_adc", temp_get_entry, RT_NULL, 1024, 11, 20);
//启动线程
if(RT_NULL != temp_get_adc)
{
rt_thread_startup(temp_get_adc);
}
return ret;
}
pwm_thread线程负责气泵磁阀的控制,temp_control线程负责温度的控制
rt_thread_t pwm_thread=RT_NULL,temp_control=RT_NULL;
int Pwm_Init(void)
{
pwm_dev_t5 = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME5);
RT_ASSERT(pwm_dev_t5 != RT_NULL);
/* 设置PWM周期和脉冲宽度 */
rt_pwm_set(pwm_dev_t5, PWM_DEV_CHANNEL0, period, pulse);
/* 使能设备 */
rt_pwm_enable(pwm_dev_t5, PWM_DEV_CHANNEL0);
pwm_dev_t3 = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME3);
RT_ASSERT(pwm_dev_t3 != RT_NULL);
rt_pwm_set(pwm_dev_t3, PWM_DEV_CHANNEL1, period, pulse);
rt_pwm_enable(pwm_dev_t3, PWM_DEV_CHANNEL1);
rt_pin_mode(DIR1, PIN_MODE_OUTPUT);
rt_pin_mode(DIR2, PIN_MODE_OUTPUT);
//创建led线程
pwm_thread = rt_thread_create("pwm_thread", pwm_entry, RT_NULL, 1024, 12, 10);
temp_control = rt_thread_create("temp_control", temp_control_entry, RT_NULL, 1024, 9, 10);
//启动led线程
if(RT_NULL != pwm_thread)
rt_thread_startup(pwm_thread);
if(RT_NULL != temp_control)
rt_thread_startup(temp_control);
return 0;
}
button_thread定时器控制按键
rt_timer_t button_thread=RT_NULL;
int button_init(void)//按键初始化
{
rt_pin_mode(S2, PIN_MODE_INPUT_PULLUP );//上拉输入
rt_pin_mode(S3, PIN_MODE_INPUT_PULLUP );//上拉输入
rt_pin_mode(S4, PIN_MODE_INPUT_PULLUP );//上拉输入
S2_sem = rt_sem_create("S2", 0, RT_IPC_FLAG_FIFO); //创建按键的信号量,当按键按下就释放信号量,在需要使用按键的地方获取信号量即可
S3_sem = rt_sem_create("S3", 0, RT_IPC_FLAG_FIFO);
S4_sem = rt_sem_create("S4", 0, RT_IPC_FLAG_FIFO);
//创建邮箱
key_mailbox = rt_mb_create("key_mailbox",5, RT_IPC_FLAG_FIFO);
key2_mailbox = rt_mb_create("key_mailbox",5, RT_IPC_FLAG_FIFO);
//创建定时器
button_thread = rt_timer_create("button", button_entry, RT_NULL, 20, RT_TIMER_FLAG_PERIODIC);
if(RT_NULL != button_thread)
{
rt_timer_start(button_thread);
// rt_kprintf("timer_button\n");
}
return 0;
}
key_mailbox,key2_mailbox邮箱负责线程间的通信 按键和temp_control、pwm_thread的通信
int button_init(void)//按键初始化
{
rt_pin_mode(S2, PIN_MODE_INPUT_PULLUP );//上拉输入
rt_pin_mode(S3, PIN_MODE_INPUT_PULLUP );//上拉输入
rt_pin_mode(S4, PIN_MODE_INPUT_PULLUP );//上拉输入
S2_sem = rt_sem_create("S2", 0, RT_IPC_FLAG_FIFO); //创建按键的信号量,当按键按下就释放信号量,在需要使用按键的地方获取信号量即可
S3_sem = rt_sem_create("S3", 0, RT_IPC_FLAG_FIFO);
S4_sem = rt_sem_create("S4", 0, RT_IPC_FLAG_FIFO);
//创建邮箱
key_mailbox = rt_mb_create("key_mailbox",5, RT_IPC_FLAG_FIFO);
key2_mailbox = rt_mb_create("key_mailbox",5, RT_IPC_FLAG_FIFO);
//创建定时器
button_thread = rt_timer_create("button", button_entry, RT_NULL, 20, RT_TIMER_FLAG_PERIODIC);
if(RT_NULL != button_thread)
{
rt_timer_start(button_thread);
// rt_kprintf("timer_button\n");
}
return 0;
}
无法确定具体原因,可能存在多种可能性,需要进行一定的排查。以下是可能的原因和解决方案:
外置电源电压不稳定或者电流不足导致传感器无法正常工作。建议检测外置电源,可以使用示波器或者万用表进行测试,测量电压和电流是否符合传感器工作的要求。如果电源电压和电流不稳定或者不足,建议更换合适的电源。
使用外置电源时,传感器和STM32的接线不正确。建议检查传感器接线是否正确,包括电源正负极是否接反等问题。如果接线有误,需要重新接线。
使用外置电源时,STM32的电源稳压电路不足以保持恒定的电压。建议检查STM32的电源稳压电路是否正常工作,可以使用示波器进行测试,检查输出的电压是否稳定。如果电压不稳定,需要修复或者更换电源稳压电路。
代码逻辑存在问题,导致使用外置电源时无法读取数据。建议检查代码逻辑是否正确,是否存在和外置电源有关的部分。可以尝试对代码进行修改,解决问题。
传感器存在损坏或者故障。建议更换新的传感器进行测试,以确定传感器本身是否存在问题。
需要根据实际情况进行排查,找到具体的原因后再进行解决。