系统功能设计
本系统由STM32F103C8T6单片机核心板、ACS712电流检测模块、电压采集、LCD1602液晶及电源组成。
1、通过单片机检测电压(15V内)和直流电流(5A内),并在1602液晶上显示。
2、电压和电流的显示最小单位0.1V,0.1A。功率=电压*电流。
3、通过大功率电阻作为假负载产生电流以备检测。
4、如果检测外部电压或者电流大小,一定要将功率负载电阻去掉。
STM32F103C8T6单片机核心板:
USB供电接口,复位按键 开关按键
合理优秀的布局布线:
主程序
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "adc.h"
#include <stdio.h>
#include "timer.h"
#include "lcd1602.h"unsigned char relayFlag=1;//中间变量char dis0[16];//显示
char dis1[16];float voltV,currA;//定义电压电流功率变量
float power;unsigned char count =0;//采集计数 用于封信显示float sumVolt,midV; //用于滤波 中间变量
float sumAcur,midA; //用于滤波 中间变量int main(void){ u16 adcx; delay_init(); //延时函数初始化 uart_init(115200); //串口初始化为115200TIM3_Int_Init(499,7199);//50ms LED_Init(); //初始化与LED连接的硬件接口LED0=0;Adc_Init(); //ADC初始化 Lcd_GPIO_init(); //初始化io lcdLcd_Init(); //初始化液晶 delay_ms(20);sprintf(dis0,"v:%3.1fV a:%3.1fA ",voltV,currA);//打印电压Lcd_Puts(0,0,(u8 *)dis0);//显示电压power = voltV*currA;sprintf(dis1,"Power:%3.1fW",power);//打印功率Lcd_Puts(0,1,(u8 *)dis1);//显示功率while(1){adcx=Get_Adc_Average(ADC_Channel_0,10);// PA0读取ad值midA=(float)adcx*(3.3/4096)*2;//转换if(midA>2.65){midA = (midA - 2.65)/0.185; } //计算电流 else{midA = 0;} adcx=Get_Adc_Average(ADC_Channel_1,10); // PA1midV = (float)adcx*(3.3/4096)*5;sumAcur = sumAcur + midA; //多次测量求平均sumVolt = sumVolt + midV; //多次测量求平均count++;//采集次数if(count >= 5){ count = 0;currA = sumAcur/5; //Q求平均if(currA < 0.1) currA= 0;//滤波微小波动sumAcur = 0;voltV = sumVolt/5;//求平均值if(voltV<0.1) voltV=0;sumVolt =0;sprintf(dis0,"v:%3.1fV a:%3.1fA ",voltV,currA);//打印电压Lcd_Puts(0,0,(u8 *)dis0);//显示电压power = voltV*currA;sprintf(dis1,"Power:%3.1fW",power);//打印功率Lcd_Puts(0,1,(u8 *)dis1);//显示功率 } delay_ms(10); }
}
原文:http://www.jh-tec.cn/archives/8275