600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 【USB电压电流表】基于STM32F103C8T6 for Arduino

【USB电压电流表】基于STM32F103C8T6 for Arduino

时间:2024-05-20 11:14:53

相关推荐

【USB电压电流表】基于STM32F103C8T6 for Arduino

主控芯片为STM32F103C8T6

Arduino 的库确实多

项目链接:USB电压电流表 - 嘉立创EDA开源硬件平台

代码也挺简单的,没有多少行。

这个项目主要是想学硬件。

经过验证作者提供了两个版本的源代码,第一版能成功编译,第二版有变量名定义错误,还比较多。经过更改后仍可使用。

输入输出

SMAJ30A:瞬态抑制二极管

供电部分

最上 5V0 部分供电是预备留用的,并没有用到!

部分检测口

PA0:D+电压采样PA3:D- 电压采样PA4:热敏电阻采样PA5:输出电压采样REST:上电自复位PA15:KEY1PB4:KEY2PB10:KEY3PB1:KEY4

电流采样

PA1:大电流采样PA2:小电流采样PB9:大电流控制PB8:小电流控制

OPA2333:运算放大器芯片

啊啊啊啊!!真烦,这一部分看不懂啊!!!!

DGND只跟两个 NMOS 管相连。

▶️电流检测值为:

map(analogRead(a1),0,4095,0,3270)/101/5/* 这里实际上是 */map(analogRead(a1),0,4095,0,3270)/101/(1000*0.005)

▶️这样,画了一个示意图:

DGND 的电流 I 流向 GND 时,PA1检测到的电压为:

故,可知电流检测值的公式由来。

很不错,学到了知识点!!!

STM32周围接口

基本都是备用留用的,没有用到!

函数分析

变量定义

//USB测试表//量程10mA-6.5A#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_SSD1306_STM32.h>#define OLED_RESET 4Adafruit_SSD1306 display(OLED_RESET);byte a1 = PA1; //大电流采样byte a2 = PA2; //小电流采样byte dn = PA3; //D-电压采样 byte dp = PA0; //D+电压采样byte wd = PA4; //NTC采样byte dy = PA5; //电压采样byte k1 = PA15; //按键检测byte k2 = PB4; //按键检测byte k3 = PB10; //按键检测byte k4 = PB1; //按键检测byte M1 = PB9; //大电流控制byte M2 = PB8; //小电流控制float V ; //电源电压float VN ; //D-电压 float VP ; //D+电压 float A ; //电流 int uA ; //电流float W ; //功率 float R ; //负载 float C ; //温度 int Wh ; //电量long int T; //时间long int WT ; //电功long int i; //时间byte K1,K2,K3,K4;//按键byte ms = 0;

电流、电压、功率测量

void VA(){ float vn = map(analogRead(dn),0,4095,0,3300); //D-电压采样VN = vn*2/1000;float vp = map(analogRead(dp),0,4095,0,3300); //D+电压采样VP = vp*2/1000;float LV = 0;float LA = 0;for(byte i = 0; i < 100; i++){float v = map(analogRead(dy),0,4095,0,3300); //输出电压采样V = v * 11/1000;LV = LV + V;float a = map(analogRead(a1),0,4095,0,3270); //大电流采样A = a/101/5;LA = LA + A;}V = LV/100; //平均值A = LA/100;W = V*A; //功率if( A > 0){ R = V/A; //电阻if(R >= 100){ R = 99.99; }UIT(); }else{R = 0;}if( A > 6.5){ digitalWrite( M1 ,LOW); } //设置大电流控制接口低电平}

analogRead(pin):读模拟引脚, 返回0-1023之间的值。map(value, fromLow, fromHigh, toLow, toHigh):等比例缩放值。

测量电量

void UIT(){ if(millis() - T > 1000){ T = millis();WT = WT+W;Wh = WT/3.6;} }

测量温度

void NTC(){pinMode( wd , INPUT_ANALOG); //模拟量输入float r = map(analogRead(wd),0,4095,0,3270); //NTC采样float ntc = (10000 * r)/(3270 - r); //计算NTC值//K =(3950 * 298.15)/(3950 +(298.15 * log( ntc/ 10000))); C = (3950 * 298.15)/(3950 +(298.15 * log( ntc/10000))) - 273.15 - 4; //计算温度}

0.96OLED显示

显示样式

void SSD1306(){display.clearDisplay();//清理1306屏幕,准备显示:display.setTextColor(WHITE); //设置字体颜色display.setTextSize(2,2); //设置字体大小,(X,Y)比display.setCursor( 0 , 0 ); display.print(V); display.setCursor(62, 0 ); display.print("V");display.setCursor( 0 , 16 ); display.print(A,3); display.setCursor( 62, 17 ); display.print("A");display.setCursor( 0 , 33); display.print(W); display.setCursor( 62, 33); display.print("W");display.setCursor( 0 , 49); display.print(R); display.setCursor( 62, 49); display.print("R");display.setTextSize(1);display.setCursor( 81, 0 ); display.print(C); display.setCursor(116, 0 ); display.print("C*");display.setCursor( 81, 8 ); display.print(VP); display.setCursor(116, 8 ); display.print("D+"); display.setCursor( 81, 17); display.print(VN); display.setCursor(116, 17); display.print("D-");display.setCursor( 81, 25); display.print(Wh); display.setCursor(110, 25); display.print("mWh");display.display(); //把缓存都显示 }

初始化

void setup(){Serial.begin(9600);pinMode( a1 , INPUT_ANALOG);pinMode( a2 , INPUT_ANALOG);pinMode( dn , INPUT_ANALOG);pinMode( dp , INPUT_ANALOG);pinMode( wd , INPUT_ANALOG);pinMode( dy , INPUT_ANALOG);pinMode( k1 , INPUT_PULLUP);pinMode( k2 , INPUT_PULLUP);pinMode( k3 , INPUT_PULLUP);pinMode( k4 , INPUT_PULLUP);pinMode( M1, OUTPUT);pinMode( M2, OUTPUT);digitalWrite( M1 ,HIGH);digitalWrite( M2 ,LOW);display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //OLED通讯地址display.clearDisplay(); }

循环函数

void loop(){VA();//测量各种东西NTC(); //温度检测函数,应该加高温断电功能的!KEY(); //按键检测,没用上,相关函数没写if(millis() - i > 200){//刷新i = millis();SSD1306();} }

总结

参考:Adafruit_SSD1306库学习_RenKaixuan0124的博客-CSDN博客_ssd1306库

项目资源,来自于原作者负熵生之光

链接:/s/1QG5SR7RUGEHU3qOS54ZcHg

提取码:dj85

本项目复刻起来比较容易,软件都是库,主要是硬件问题。

🉑 ㊗️学会了电流检测的方法!很棒!!!!!!!!

加油学习!!!

都是自己分析开源项目的一些笔记,如果对您有些帮助,点点赞吧!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。