基于单片机ACS712直流电流测量检测设计

本文详细介绍了如何利用单片机和ACS712电流传感器设计一种直流电流测量系统,包括传感器连接、信号处理、软件编程和系统调试。设计过程强调了高精度霍尔效应、灵敏度系数调整以及稳定性增强措施。
摘要由CSDN通过智能技术生成

**单片机设计介绍,基于单片机ACS712直流电流测量检测设计

一 概要

  基于单片机ACS712的直流电流测量检测设计是一种结合单片机控制技术和ACS712电流传感器技术的电流测量方案。该设计的核心在于利用ACS712的高精度霍尔效应电流传感功能,将直流电流转换为与之成比例的电压信号,并通过单片机进行读取和处理,从而实现对直流电流的精确测量。

设计过程中,首先需要将ACS712传感器与待测电路中的直流电流路径相连,以便实时检测电流值。ACS712传感器的输出是一个与电流成比例的电压信号,这个信号随后被送入单片机进行进一步处理。

单片机的角色是读取传感器输出的电压信号,并根据ACS712的灵敏度系数(Sensitivity)将其转换为对应的电流值。这个灵敏度系数是已知的,并且根据不同的ACS712量程(±5A、±20A、±30A)而有所不同。单片机通过内部计算,将电压信号转换为电流值,并将结果显示在连接的显示设备上,如数码管或液晶显示屏。

此外,为了增加系统的稳定性和可靠性,设计中可能还会包含一些额外的电路,如滤波电路以减少噪声干扰,以及保护电路以防止过流或短路等异常情况对系统和传感器造成损害。

最后,通过适当的编程和校准,可以确保基于单片机ACS712的直流电流测量检测系统能够准确、稳定地工作,并适用于各种需要精确测量直流电流的场合。

总体而言,基于单片机ACS712的直流电流测量检测设计是一种高效、可靠的电流测量方案,结合了单片机的灵活性和ACS712传感器的高精度特性,能够满足多种应用场景的需求。

二、功能设计

文件夹内包含工程文件,可直接运行或者二次开发;

此设计可作为毕业设计和课程设计资料,包含原理图、程序代码(嵌入式类设计)、软件资料等等,非常完善;

三、 软件设计

本系统原理图设计采用Altium Designer19,具体如图。在本科单片机设计中,设计电路使用的软件一般是Altium Designer或proteus,由于Altium Designer功能强大,可以设计硬件电路的原理图、PCB图,且界面简单,易操作,上手快。Altium Designer19是一款专业的整的端到端电子印刷电路板设计环境,用于电子印刷电路板设计。它结合了原理图设计、PCB设计、多种管理及仿真技术,能够很好的满足本次设计需求。

————————————————

仿真实现
本设计利用protues8.7软件实现仿真设计,具体如图。

Protues也是在单片机仿真设计中常用的设计软件之一,通过设计出硬件电路图,及写入驱动程序,就能在不实现硬件的情况进行电路调试。另外,protues还能实现PCB的设计,在仿真中也可以与KEIL实现联调,便于程序的调试,且支持多种平台,使用简单便捷。
————————————————

原理图

在这里插入图片描述

在这里插入图片描述

五、 程序

本设计利用KEIL5软件实现程序设计,具体如图。作为本科期间学习的第一门编程语言,C语言是我们最熟悉的编程语言之一。当然,由于其功能强大,C语言是当前世界上使用最广泛、最受欢迎的编程语言。在单片机设计中,C语言已经逐步完全取代汇编语言,因为相比于汇编语言,C语言编译与运行、调试十分方便,且可移植性高,可读性好,便于烧录与写入硬件系统,因此C语言被广泛应用在单片机设计中。keil软件由于其兼容单片机的设计,能够实现快速调试,并生成烧录文件,被广泛应用于C语言的编写和单片机的设计。
在这里插入图片描述

————————————————

在这里插入图片描述

六、 文章目录

目 录

摘 要 I
Abstract II
引 言 1
1 控制系统设计 2
1.1 主控系统方案设计 2
1.2 传感器方案设计 3
1.3 系统工作原理 5
2 硬件设计 6
2.1 主电路 6
2.1.1 单片机的选择 6
2.2 驱动电路 8
2.2.1 比较器的介绍 8
2.3放大电路 8
2.4最小系统 11
3 软件设计 13
3.1编程语言的选择 13
4 系统调试 16
4.1 系统硬件调试 16
4.2 系统软件调试 16
结 论 17
参考文献 18
附录1 总体原理图设计 20
附录2 源程序清单 21
致 谢 25

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是基于stm32f103c8t6单片机ACS712直流电测量传感器的示例代码: ```C #include "stm32f10x.h" #define ADC1_DR_Address ((uint32_t)0x4001244C) // 定义ADC1的值 __IO uint16_t ADC1_ConvertedValue; // 初始化ADC1 void ADC1_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; DMA_InitTypeDef DMA_InitStructure; // 使能ADC1和DMA1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 配置GPIOA.1为模拟输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置DMA1通道1 DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC1_ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 1; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); // 使能DMA1通道1 DMA_Cmd(DMA1_Channel1, ENABLE); // 配置ADC1 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); // 配置ADC1通道1的采样时间和转换序列 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); // 使能ADC1 DMA ADC_DMACmd(ADC1, ENABLE); // 使能ADC1 ADC_Cmd(ADC1, ENABLE); // 开始ADC1的转换 ADC_SoftwareStartConvCmd(ADC1, ENABLE); } // 初始化串口1 void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 使能USART1和GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置USART1的TX引脚为复用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART1的RX引脚为浮空输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART1 USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStructure); // 使能USART1 USART_Cmd(USART1, ENABLE); } // 发送字符串到串口1 void USART1_SendString(char* str) { while (*str != '\0') { USART_SendData(USART1, (uint16_t)(*str++)); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } } int main(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); ADC1_Init(); USART1_Init(); while (1) { // 将ADC1_ConvertedValue转换为电压值 float voltage = ADC1_ConvertedValue * 3.3 / 4096; // 将电压值转换为电流值 float current = (voltage - 1.65) / 0.066; // 将电流值转换为字符串 char str[20]; sprintf(str, "Current: %.2fA\r\n", current); // 发送字符串到串口1 USART1_SendString(str); // 等待一段时间 for (int i = 0; i < 1000000; i++); // 点亮LED GPIO_SetBits(GPIOC, GPIO_Pin_13); // 等待一段时间 for (int i = 0; i < 1000000; i++); // 熄灭LED GPIO_ResetBits(GPIOC, GPIO_Pin_13); } } ``` 在示例代码中,我们使用了ADC1和DMA1来读取ACS712的模拟输出。ADC1的采样时间设置为239.5个时钟周期,这样可以保证最高的精度。ADC1每次采样后,会将结果写入ADC1_DR寄存器中,然后DMA1会将这个结果读取到ADC1_ConvertedValue变量中。我们可以将ADC1_ConvertedValue转换为电压值,然后再将电压值转换为电流值。最后,我们将电流值发送到串口1,并将LED交替点亮和熄灭。 需要注意的是,ACS712会在0A附近输出1.65V的直流电压,因此需要将读取到的电压值减去1.65V,然后再除以0.066V/A,才能得到真正的电流值。 如果你使用的是其他型号的单片机或者其他型号的直流电测量传感器,那么示例代码需要做一些修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值