首页 > 编程知识 正文

acs712电流检测怎么用,acs712电流检测计算公式

时间:2023-05-05 08:02:01 阅读:176593 作者:2724

ACS712电流传感器ACS712是基于霍尔效应的电流传感器。

简介ACS712框图:

ACS712引脚如下表所示。 其中,I P IP IP和IpIP-IP分别是测量对象电流的流入和流出端子。 V C C VCC VCC和gndgndgnd是模块供电电压,V I O U T VIOUT VIOUT是模块输出电压值。 由于ACS712将测量对象的模拟电流变换为模拟电压输出,因此可以将V I O U T VIOUT VIOUT与AD AD连接,通过AD AD测量V I O U T VIOUT VIOUT,Viout Vi out与测量对象电流呈线性关系

ACS712测电流是串联到电路里的!!!!

V I O U T VIOUT VIOUT与被测电流呈线性关系,具体关系可参考官网说明书。 这里以5A为例。

代码的主要代码是A D C ADC ADC。 这里参考正点原子的A D C ADC ADC码,以STM 32 STM 32 STM 32 STM 32为例。

博主用了两个 A D C ADC ADC通道,分别是 A D C 1 ADC1 ADC1的通道 5 5 5和 8 8 8。

#include "adc.h"#include "delay.h" // //本程序只供学习使用,未经作者许可,不得用于其它任何用途//ALIENTEK STM32F407开发板//ADC 驱动代码 //正点原子@ALIENTEK//技术论坛:www.openedv.com//创建日期:2014/5/6//版本:V1.0//版权所有,盗版必究。//Copyright(C) 广州市星翼电子科技有限公司 2014-2024//All rights reserved // //初始化ADC void Adc_Init(void){ GPIO_InitTypeDef GPIO_InitStructure;ADC_CommonInitTypeDef ADC_CommonInitStructure;ADC_InitTypeDef ADC_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟 //先初始化ADC1通道5 IO口GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 通道5GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 //先初始化ADC1通道4 IO口GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PA4 通道4GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化 RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1复位RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);//复位结束 ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA失能ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz ADC_CommonInit(&ADC_CommonInitStructure);//初始化ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐 注意要改!!!!ADC_InitStructure.ADC_NbrOfConversion = 2;//1个转换在规则序列中 也就是只转换规则序列1 ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化 ADC_Cmd(ADC1, ENABLE);//开启AD转换器} //获得ADC值//ch: @ref ADC_channels //通道值 0~16取值范围为:ADC_Channel_0~ADC_Channel_16//返回值:转换结果u16 Get_Adc(u8 ch) { //设置指定ADC的规则组通道,一个序列,采样时间ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );//ADC1,ADC通道,480个周期,提高采样时间可以提高精确度 ADC_SoftwareStartConv(ADC1);//使能指定的ADC1的软件转换启动功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束return ADC_GetConversionValue(ADC1);//返回最近一次ADC1规则组的转换结果}//获取通道ch的转换值,取times次,然后平均 //ch:通道编号//times:获取次数//返回值:通道ch的times次转换结果平均值u16 Get_Adc_Average(u8 ch,u8 times){u32 temp_val=0;u8 t;for(t=0;t<times;t++){temp_val+=Get_Adc(ch);delay_ms(5);}return temp_val/times;} adcx1=Get_Adc_Average(ADC_Channel_5,2);//获取通道5的转换值,2次取平均temp1 = (float)adcx*(3.3/4096); //获取计算后的带小数的实际电压值,比如3.1111printf("ADC ch5-- %f rn",temp1);printf("ADC ch5-- %d rn",adcx1);adcx2=Get_Adc_Average(ADC_Channel_8,2);//获取通道8的转换值,2次取平均temp2 = (float)adcx*(3.3/4096); //获取计算后的带小数的实际电压值,比如3.1111printf("ADC ch8-- %frn",temp2);printf("ADC ch8-- %drn",adcx2);

   获取后的 a d c x adcx adcx模拟电压可以通过待测电流和模拟电压的线性关系返推出来,这个就不算了,留给你们把哈哈哈,再强调一遍:

ACS712测电流是串联到电路里的!!!!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。