原文:http://www.jh-tec.cn/archives/8275
系统功能设计
本系统由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); //串口初始化为115200
TIM3_Int_Init(499,7199);//50ms
LED_Init(); //初始化与LED连接的硬件接口
LED0=0;
Adc_Init(); //ADC初始化
Lcd_GPIO_init(); //初始化io lcd
Lcd_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); // PA1
midV = (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);
}
}