ADC基于stm32的电压电流采集.docx
《ADC基于stm32的电压电流采集.docx》由会员分享,可在线阅读,更多相关《ADC基于stm32的电压电流采集.docx(18页珍藏版)》请在冰豆网上搜索。
ADC基于stm32的电压电流采集
ADC基于stm32的电压电流采集,用数码管显示
首先组装硬件,如下图所示:
如上图连接数码管与单片机,然后再按下图做两路电压采集电路,运用op07对电流进行30倍放大即可测得相对精准的电压,如下图所示:
以上步骤完成即可编写程序,程序如下:
*/
/*Includes------------------------------------------------------------------*/
#include"stm32f10x.h"
#include
#include"LED8.h"
#ifdef__GNUC__
/*WithGCC/RAISONANCE,smallprintf(optionLDLinker->Libraries->Smallprintf
setto'Yes')calls__io_putchar()*/
#definePUTCHAR_PROTOTYPEint__io_putchar(intch)
#else
#definePUTCHAR_PROTOTYPEintfputc(intch,FILE*f)
#endif/*__GNUC__*/
#defineADC1_DR_Address((u32)0x4001244C)
/*Privatefunctionprototypes-----------------------------------------------*/
voidGPIO_Configuration(void);
voidNVIC_Configuration(void);
voidTIM_Configuration(void);
voidADC_Configuration(void);
voidnumdisplay(uint16_tnum);
voidnumdisplay1(uint16_tnum);
voiddelay(void);
voiddelay()
{
inti,j;
for(i=0;i<0xfffff;i++)j++;
}
vu16ADC_ConvertedValue[3];
/*******************************************************************************
*FunctionName:
main
*Description:
Mainprogram
*Input:
None
*Output:
None
*Return:
None
*Attention:
None
*******************************************************************************/
intmain(void)
{
inti=0;
GPIO_Configuration();
NVIC_Configuration();
TIM_Configuration();
ADC_Configuration();
/*Infiniteloop*/
for(i=0;i<10;i++)
{
numb[i]=i;
}
numb[10]=1;
numb[11]=2;
numb[12]=3;
numb[13]=4;
numb[14]=5;
numb[15]=6;;
while
(1)
{delay();
numdisplay((ADC_ConvertedValue[1]/4.096)*10.79);//显示电流值
numdisplay1((ADC_ConvertedValue[2]/4.096)*11.755);//显示电压值
}
}
/*******************************************************************************
*FunctionName:
GPIO_Configuration
*Description:
ConfigureGPIOPin
*Input:
None
*Output:
None
*Return:
None
*Attention:
None
*******************************************************************************/
voidnumdisplay(uint16_tnum)//电流的
{
uint16_ttemp1=0;
uint16_ttemp2=0;
uint16_ttemp3=0;
uint16_ttemp4=0;
if((num<10000)&&(num>=1000))
{
temp1=num/1000;
temp2=(num-temp1*1000)/100;
temp3=(num-temp1*1000-temp2*100)/10;
temp4=num-temp1*1000-temp2*100-temp3*10;
}
elseif((num<1000)&&(num>=100))
{
temp2=num/100;
temp3=(num-temp2*100)/10;
temp4=num-temp2*100-temp3*10;
}
elseif((100>num)&&(num>=10))
{
temp3=num/10;
temp4=num-temp3*10;
}
elseif(num<10)
{
temp4=num;
}
else
{}
numb[12]=temp1;
numb[13]=temp2;
numb[14]=temp3;
numb[15]=temp4;
}
voidnumdisplay1(uint16_tnum)//电压的
{
uint16_ttemp5=0;
uint16_ttemp6=0;
uint16_ttemp7=0;
uint16_ttemp8=0;
if((num<10000)&&(num>=1000))
{
temp5=num/1000;
temp6=(num-temp5*1000)/100;
temp7=(num-temp5*1000-temp6*100)/10;
temp8=num-temp5*1000-temp6*100-temp7*10;
}
elseif((num<1000)&&(num>=100))
{
temp6=num/100;
temp7=(num-temp6*100)/10;
temp8=num-temp6*100-temp7*10;
}
elseif((100>num)&&(num>=10))
{
temp5=10;
temp7=num/10;
temp8=num-temp7*10;
}
elseif(num<10)
{
temp5=10;
temp8=num;
}
else
{}
numb[8]=temp5;
numb[9]=temp6;
numb[10]=temp7;
numb[11]=temp8;
}
voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD
|RCC_APB2Periph_GPIOE,ENABLE);
/**
*LED1->PD8,LED2->PD9,LED3->PD10,LED4->PD11
*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9
|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_7|GPIO_Pin_10|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_11|GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;;
GPIO_Init(GPIOB,&GPIO_InitStructure);
/*ConfigurePA.05.06.07(ADCChannel5.6.7)asanaloginput-------------------------*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
voidADC_Configuration(void)
{
ADC_InitTypeDefADC_InitStructure;
DMA_InitTypeDefDMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_AFIO,ENABLE);
/*DMAchannel1configuration----------------------------------------------*/
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&ADC_ConvertedValue;
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize=3;
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
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);
/*EnableDMA1channel1*/
DMA_Cmd(DMA1_Channel1,ENABLE);
/*ADC1configuration------------------------------------------------------*/
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode=ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel=3;
ADC_Init(ADC1,&ADC_InitStructure);
/*ADC1regularchannel15configuration*/
ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_6,2,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_7,3,ADC_SampleTime_239Cycles5);
/*EnableADC1DMA*/
ADC_DMACmd(ADC1,ENABLE);
/*EnableADC1*/
ADC_Cmd(ADC1,ENABLE);
/*EnableADC1resetcalibarationregister*/
ADC_ResetCalibration(ADC1);
/*ChecktheendofADC1resetcalibrationregister*/
while(ADC_GetResetCalibrationStatus(ADC1));
/*StartADC1calibaration*/
ADC_StartCalibration(ADC1);
/*ChecktheendofADC1calibration*/
while(ADC_GetCalibrationStatus(ADC1));
/*StartADC1SoftwareConversion*/
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}
/*******************************************************************************
*FunctionName:
TIM_Configuration
*Description:
TIM_Configurationprogram.
*Input:
None
*Output:
None
*Reswitch(count2)turn:
None
*Attention:
None
*******************************************************************************/
voidTIM_Configuration(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_DeInit(TIM3);
TIM_TimeBaseStructure.TIM_Period=200;/*自动重装载寄存器周期的值(计数值)*/
/*累计TIM_Period个频率后产生一个更新或者中断*/
TIM_TimeBaseStructure.TIM_Prescaler=(100-1);/*时钟预分频数例如:
时钟频率=72MHZ/(时钟预分频+1)*/
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;/*采样分频*/
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/*向上计数模式*/
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_ClearFlag(TIM3,TIM_FLAG_Update);/*清除溢出中断标志*/
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3,ENABLE);/*开启时钟*/
}
/*******************************************************************************
*FunctionName:
NVIC_Configuration
*Description:
Configurationthenestedvectoredinterruptcontroller.
*Input:
None
*Output:
None
*Return:
None
*Attention:
None
*******************************************************************************/
voidNVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
#ifdefUSE_FULL_ASSERT
/**
*@briefReportsthenameofthesourcefileandthesourcelinenumber
*wheretheassert_paramerrorhasoccurred.
*@paramfile:
pointertothesourcefilename
*@paramline:
assert_paramerrorlinesourcenumber
*@retvalNone
*/
voidassert_failed(uint8_t*file,uint32_tline)
{
/*Usercanaddhisownimplementationtoreportthefilenameandlinenumber,
ex:
printf("Wrongparametersvalue:
file%sonline%d\r\n",file,line)*/
/*Infiniteloop*/
while
(1)
{
}
}
#endif
/*********************************************************************************************************
ENDFILE
********