资讯详情

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

USB电压电流表 - 嘉立创EDA开源硬件平台

代码也很简单,行不多。


输入输出

SMAJ30A:二极管瞬态抑制


供电部分

最上 5V0 部分供电准备留用,未使用!


部分检测口


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

DGND只跟两个 NMOS 管相连。

??

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

??

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

学知识点很好!


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); }    ///设置大电流控制接口低电平 } 

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;    //计算温度
}

显示样式
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

🉑 ㊗️

标签: 26k1电阻二极管lvsmaj12catvs二极管smaj160catvs二极管电阻9k1smaj150atvs二极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台