在完成了基础任务,实现了每个模块单独控制后,就开始着手去做进阶任务了。可惜道路不是一帆风顺的,期间出了很多状况。
问题1:电流模块烧毁:这次功率检测使用了INA219电流检测模块。该模块可以接26v内的电压,可以测量到8A的电流。然后我就成功地将该模块烧毁了。烧毁后的表现为,能够测量电流,但是电压测量始终显示为0。从某宝上购买芯片,挽救这个模块。
使用锡箔纸,保护一下板子,使用热风枪,成功换芯。
问题2:需要共地。为了实现单片机控制电路通断功能。一开始我采用的方案是:使用一个L298N驱动模块,接入12v电源。NUCLEO-F411RE通过GPIO输出高低电平,输出给L298N的INA上,控制输出端输出0V或12V。输出端接入INA219电流检测模块,电机和INA219电流检测模块串联,完成电路控制。
但是这里出现个问题,L298N驱动模块输出的12v电压和电流模块的控制电压是不共地的。如果将L298N驱动模块输出端的负极,和电流模块输出端的GND连接起来,电源就会短路保护。经过多次测试,最终放弃此方案,改用继电器来开关电源。继电器能够很方便地共地处理。
问题3:电路中干扰太大,单片机很容易死机。使用继电器控制整个电路后,电机对整个电路产生了巨大的污染,导致NUCLEO-F411RE频繁死机。电路无法稳定地工作。这个暂时无法解决,最后去掉了电机,改用一个卤素灯作为负载,工作情况才有好转。
进阶任务:1. 在以上任务基础上,增加对INA219电流传感器的应用,例如电机过流保护控制,使用开发板的串口或者外接按键,可以修改过流阈值,并且过流控制响应在0.5s以内;2.实现自锁模式与打嗝模式,自锁模式:当过流保护产生时,必须使用按键或者串口指令恢复控制;打嗝模式:当过流保护产生时停止负载,过流消失1s(可自行设定)后自行恢复控制。
实现该任务,接线比较复杂。解决了接线问题后,就比较容易了。首先实现OLED
// u8g2.setFont(u8g2_font_unifont_t_chinese2); // use chinese2 u8g2.firstPage(); do { u8g2.setFont(u8g2_font_cu12_tf); // u8g2.setCursor(5, 15); u8g2.print("Power:"); // u8g2.setCursor(60, 15); dtostrf(p, 5, 2, fValue); u8g2.print(fValue); u8g2.setCursor(100, 15); u8g2.print("mW"); // u8g2.setFont(u8g2_font_spleen12x24_mf); // use chinese2 u8g2.setCursor(5, 40); u8g2.print("V:"); // u8g2.setCursor(30, 40); dtostrf(v, 5, 1, fValue); u8g2.print(fValue); u8g2.setCursor(115, 40); u8g2.print("V"); // u8g2.setCursor(5, 64); u8g2.print("I:"); // u8g2.setCursor(30, 64); dtostrf(i, 5, 1, fValue); u8g2.print(fValue); u8g2.setCursor(105, 64); u8g2.print("mA"); // } while (u8g2.nextPage());
在OLED屏幕上显示,功率、电压、电流三项数据。继电器接到D13管脚,也是板载的LED灯的输出。将LED灯和继电器关联起来,这样更方便直观地可以看见电路的通断。
if (i >= 800) { lasttime = millis(); digitalWrite(LED_BUILTIN, LOW); } if (millis() - lasttime > 5000) { digitalWrite(LED_BUILTIN, HIGH); }
通过判断电流的大小,来关断继电器,断开负载电路的输出。实现保护负载电路的功能。恢复电路这里设置了5秒(可以修改为1秒),是方便自己调节可调电源的电压。但是这里每次电源自动恢复时,应该是电路中电流冲击过大,很容易导致死机。或者是使用板载的USER按键,强行开启继电器,使负载电源供电。
心得体会
参加《Let's do 2025年第1期——DigiKey陪你走过春夏秋冬·DIY功率监测与控制系统》活动,让我尝试了一下低电压控制高电压的实验。期间曲折,也让自己明白了电路设计的不易,电路设计中的干扰着时让人心烦,还需要继续努力学习。
视频:https://www.bilibili.com/video/BV11hKAznExE/