ACS712 电流传感器
?? ACS712 是基于霍尔效应的电流传感器。
简介
?? ACS712 框图: ?? ACS712 引脚如下表,其中
I
P
+
IP+
IP+和
I
P
?
IP-
IP?分别是待测电流的流入和流出引脚。
V
C
C
VCC
VCC和
G
N
D
GND
GND是模块供电电压,
V
I
O
U
T
VIOUT
VIOUT是模块输出电压值。ACS712将待测的模拟电流转化为模拟电压输出,因此可以将
V
I
O
U
T
VIOUT
VIOUT接入到
A
D
AD
AD,通过
A
D
AD
AD测量出
V
I
O
U
T
VIOUT
VIOUT,由于
V
I
O
U
T
VIOUT
VIOUT和待测电流呈现线性关系,因此可以反向推导出待测电流。
ACS712测电流是串联到电路里的!!!!
??
V
I
O
U
T
VIOUT
VIOUT和待测电流呈现线性关系,其具体关系可以参考官网说明书,这里以5A为例:
代码
?? 其实主要的代码就是
A
D
C
ADC
ADC,这里参考正点原子的
A
D
C
ADC
ADC代码,以
S
T
M
32
STM32
STM32为例。博主用了两个
A
D
C
ADC
ADC通道,分别是
A
D
C
1
ADC1
ADC1的通道
5
5
5和
8
8
8。
#include "adc.h"
#include "delay.h"
void Adc_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
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;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
}
u16 Get_Adc(u8 ch)
{
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );
ADC_SoftwareStartConv(ADC1);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
return ADC_GetConversionValue(ADC1);
}
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);
temp1 = (float)adcx*(3.3/4096);
printf("ADC ch5-- %f \r\n",temp1);
printf("ADC ch5-- %d \r\n",adcx1);
adcx2=Get_Adc_Average(ADC_Channel_8,2);
temp2 = (float)adcx*(3.3/4096);
printf("ADC ch8-- %f\r\n",temp2);
printf("ADC ch8-- %d\r\n",adcx2);
?? 获取后的
a
d
c
x
adcx
adcx模拟电压可以通过待测电流和模拟电压的线性关系返推出来,这个就不算了,留给你们把哈哈哈,再强调一遍:
ACS712测电流是串联到电路里的!!!!
|