原文: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);	
	}											    
}	

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐