功能介绍:采用stm32单片机作为主控CPU,采用精密电阻分压将高电压分压后接入STM32单片机ADC接口,采用ADC可以采集出当前的电压值,通过功率电阻来测量电路中的电流,通过串联电路电流相同的原理,可以测出当前负载的电流,通过LCD1602显示电流和电压值,程序有中文注释,新手容易看懂,资料分享下载链接:设计资料合集
下面是功能演示视频:
78-基于stm32单片机电压电流检测LCD1602显示(程序+原理图+元件清单全套资料)
下面是程序部分展示(程序有中文注释,新手容易看懂)
程序部分展示:
int main(void)
{
u16 adcx,adcx1,tmp;
unsigned char chr[5];
float temp,temp1 ;
int dianya,dianliu;
u16 buf ;
delay_init(); //延时函数初始化
uart_init(9600);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
Adc_Init();
LCD1602_Init();
while(1)
{
adcx=Get_Adc_Average(ADC_Channel_8,10);//读取电压
adcx1=Get_Adc_Average(ADC_Channel_9,10);//读取电流
temp=(float)adcx/4096*3.300*2;
temp1=(float)adcx1/4096*3.300/2.2;
printf("V=%.3f V\r\n",temp);
printf("I=%.3f A\r\n",temp1);//数据上传电脑
dianya=temp*1000;//小数点后移三位,全部变成整数LCD显示
dianliu=temp1*1000;//小数点后移三位,全部变成整数LCD显示
LCD_Write_Command(0x80);//第一行的首地址
LCD_Write_Date(' ');
LCD_Write_Date(' ');
LCD_Write_Date(' ');
LCD_Write_Date('V');
LCD_Write_Date('=');
LCD_Write_Date(' ');
LCD_Write_Date(dianya%10000/1000+0x30); //显示电压
LCD_Write_Date('.');
LCD_Write_Date(dianya%1000/100+0x30);
LCD_Write_Date(dianya%100/10+0x30);
LCD_Write_Date(dianya%10+0x30);
LCD_Write_Date('V');
LCD_Write_Command(0x80+0x40);
LCD_Write_Date(' ');
LCD_Write_Date(' ');
LCD_Write_Date(' ');
LCD_Write_Date('I');
LCD_Write_Date('=');
LCD_Write_Date(' ');
LCD_Write_Date(dianliu%10000/1000+0x30); //显示电流
LCD_Write_Date('.');
LCD_Write_Date(dianliu%1000/100+0x30);
LCD_Write_Date(dianliu%100/10+0x30);
LCD_Write_Date(dianliu%10+0x30);
LCD_Write_Date('A');
delay_ms(300);
}
}
void LCD_Write_Command(u8 com)
{
rs=0; //写指令函数和写数据函数其实可以并一起价格 BOOL变量判断是写指令就rs=0写数据就rs=1。
rw=0;
en=1; //写指令 输入:RS=L,RW=L,E=下降沿脉冲
GPIO_Write(GPIOA, 0X00FF&com);//该函数一般用来往一次性一个GPIO的多个端口设置
delay_ms(2);
en=0;
}
/*******************写数据函数************************/
void LCD_Write_Date(u8 date)
{
rs=1;
rw=0;
en=1; //写数据 输入:RS=H,RW=L,E=下降沿脉冲
GPIO_Write(GPIOA, 0X00FF&date);//GPIOA的第八位用来作为8位数据口
delay_ms(2);
en=0;
}
程序打开方法:采用keil5打开,公众号有软件安装包
原理图采用【AD】altium designer打开,公众号有安装包
下面是文件包里面包含的相关文件展示
stm32单片机最小系统讲解:
电源
电就是MCU要吃的饭,不吃饭,stm32芯片肯定不能工作。
stm32最小系统板需要5v和3.3v两种电压,一般可以直接通过USB提供5v电压,也可以用电源适配器提供5V电压。而3.3v电压可以通过稳压芯片如ASM1117-3.3v等,把5v电压降为3.3v输出。
参考电源电路如下:
图中J1是USB接口,提供的5v电压经过ASM1117-3.3v后降为3v3,C1,C2(10*10^4pF=0.1u)用于电源滤波,高频滤波用小电容,低频滤波用大电容。D3是一个led用以指示电源工况,其上的R1 510R即510.0Ω用以限流,防止led灯烧坏。
J3也是一个USB接口,提供5v电压,同时它也是一个模拟串口,其D-和D+引脚与ch340相应引脚连接构成一个串口设备。
stm32吃的是3v3将其VDD和VSS引脚分别连接到3v3和GND,就解决了stm32的吃饭问题。
注意:VBAT是stm32芯片的备用3.3v电源输入端,当没有备用电源是也需要将VBAT接到VDD上去。
VDDA和VSSA是模拟电源输入口,用以给stm32芯片内部ADC,复位电路供电因此必须分别接到VDD和VSS上。
复位电路
人工作久了容易自闭、精神恍惚,这时需要睡一觉就以重新焕发活力。stm32工作久了也容易“精神恍惚”————程序跑飞,也需要复位。
stm32的NRST引脚是复位信号接收引脚与RESET相连,芯片低电平复位。如上图所示,当芯片刚上电时,电容充电导通,此时RESET=0,芯片复位;当按下复位按钮时,RESET接地,芯片复位。
晶振电路
晶振是芯片的心跳,每一次脉冲激励芯片执行一条指令,因此晶振的重要性不言而喻。
上图是stm32的晶振电路,8M无源晶振,其中R9(1M)用于稳定晶振的脉冲波形,C8(20P)和C9(20P)一方面构成晶振起振的必要回路,另一方面匹配电容,同时还具有调节晶振电路频率的作用。
注意:OSC32IN是外部32.768K晶振输入口,可以直接接时钟信号,也可以不洁作IO用。OSCIN是外部系统时钟输入信号,可以接时钟信号,也可以不接做IO口用,此时stm32用芯片内部的RC电路起振产生时钟信号。