IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【USB电压电流表】基于STM32F103C8T6 for Arduino -> 正文阅读

[嵌入式]【USB电压电流表】基于STM32F103C8T6 for Arduino

主控芯片为STM32F103C8T6

Arduino 的库确实多

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

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

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

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


输入输出

SMAJ30A:瞬态抑制二极管


供电部分

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


部分检测口

  • PA0:D+电压采样
  • PA3:D- 电压采样
  • PA4:热敏电阻采样
  • PA5:输出电压采样
  • REST:上电自复位
  • PA15:KEY1
  • PB4:KEY2
  • PB10:KEY3
  • PB1: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检测到的电压为:

I*0.005*\frac{101}{1}

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

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


STM32周围接口

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


函数分析

变量定义

//USB测试表
//量程10mA-6.5A
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306_STM32.h>

#define OLED_RESET 4
Adafruit_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库

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

链接:https://pan.baidu.com/s/1QG5SR7RUGEHU3qOS54ZcHg
提取码:dj85

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

🉑 祝? 学会了电流检测的方法!很棒!!!!!!!!

加油学习!!!

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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 19:03:54  更:2022-07-20 19:05:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 13:25:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码