初级会员

- 积分
- 69
- 金钱
- 69
- 注册时间
- 2018-12-13
- 在线时间
- 10 小时
|
2金钱
最近在搞一个项目就是关于如题的两路AD采集正弦波幅值的(一个电压一个电流),有几点困惑1:32AD引脚只能承受0-3.3V电压,如果要测-3.3到+3.3(我这边要测市电)需要软件方面做一些什么呢?2看过原子哥回复的一个帖子:原子哥说以很快的采样率采样,在一个周期内,将最大值记录下来,就是他的幅值了。但是如果峰值处波形正好出现抖动怎么办呢?下面附上我的部分源码,我的这个只是实时显示采集到的幅值。期待大神帮忙解答 谢谢!
void ADCx_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //¶¨òå½á11ìå±äá¿
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1|RCC_APB2Periph_AFIO,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//éèÖÃADC·ÖÆμòò×ó6 72M/6=12,ADC×î′óê±¼ä2»Äü3¬1y14M
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)&ADC1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&ADC_ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 2;
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);
DMA_Cmd(DMA1_Channel1, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //Ä£Äaêäèë
//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //Ä£Äaêäèë
//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
ADC_DeInit(ADC1);//?? ADC1,?? ADC1,
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;//é¨ÃèÄ£ê½
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//¿aÆôá¬Dø×a»»
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//½ûÖ1′¥·¢¼ì2a£¬ê1óÃèí¼t′¥·¢
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//óò¶ÔÆë
ADC_InitStructure.ADC_NbrOfChannel = 2;//1¸ö×a»»Ôú1æÔòDòáDÖD ò2¾íêÇÖ»×a»»1æÔòDòáD1
ADC_Init(ADC1, &ADC_InitStructure);//ADC3õê¼»ˉ
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE);//¿aÆôAD×a»»Æ÷
ADC_ResetCalibration(ADC1);//ÖØÖÃÖ¸¶¨μÄADCμÄD£×¼¼Ä′æÆ÷
while(ADC_GetResetCalibrationStatus(ADC1));//»ñè¡ADCÖØÖÃD£×¼¼Ä′æÆ÷μÄ×′ì¬
ADC_StartCalibration(ADC1);//¿aê¼Ö¸¶¨ADCμÄD£×¼×′ì¬
while(ADC_GetCalibrationStatus(ADC1));//»ñè¡Ö¸¶¨ADCμÄD£×¼3ìDò
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ê1Äü»òÕßê§ÄüÖ¸¶¨μÄADCμÄèí¼t×a»»Æô¶ˉ1|Äü
}
/*******************************************************************************
* oˉ êy Ãû : Get_ADC_Value
* oˉêy1|Äü : »ñè¡í¨μàchμÄ×a»»Ö죬è¡times′Î,è»o󯽾ù
* êä èë : ch:í¨μà±àoÅ
times:»ñè¡′Îêy
* êä 3ö : í¨μàchμÄtimes′Î×a»»½á1ûƽ¾ùÖμ
*******************************************************************************/
u16 Get_ADC_Value(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
//éèÖÃÖ¸¶¨ADCμÄ1æÔò×éí¨μ࣬ò»¸öDòáD£¬2éÑùê±¼ä
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5); //ADC1,ADCí¨μà,239.5¸öÖüÆú,ìá¸ß2éÑùê±¼ä¿éòÔìá¸ß¾«è·¶è
for(t=0;t<times;t++)
{
//ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ê1ÄüÖ¸¶¨μÄADC1μÄèí¼t×a»»Æô¶ˉ1|Äü
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//μè′y×a»»½áêø
//temp_val+=ADC_GetConversionValue(ADC1);
temp_val+=ADC_ConvertedValue[0];
delay_ms(5);
}
return temp_val/times;
}
u16 Get_ADC1_Value(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
//éèÖÃÖ¸¶¨ADCμÄ1æÔò×éí¨μ࣬ò»¸öDòáD£¬2éÑùê±¼ä
ADC_RegularChannelConfig(ADC1, ch, 2, ADC_SampleTime_239Cycles5); //ADC1,ADCí¨μà,239.5¸öÖüÆú,ìá¸ß2éÑùê±¼ä¿éòÔìá¸ß¾«è·¶è
for(t=0;t<times;t++)
{
//ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ê1ÄüÖ¸¶¨μÄADC1μÄèí¼t×a»»Æô¶ˉ1|Äü
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//μè′y×a»»½áêø
//temp_val+=ADC_GetConversionValue(ADC1);
temp_val+=ADC_ConvertedValue[1];
delay_ms(5);
}
return temp_val/times;
}
下面是主函数部分
int main(void)
{
// float f;
// float v;
// float i;
u8 i=0;
u16 value=0;
float vol;
u16 value1=0;
float vol1;
delay_init(72);
Usart1_Init(9600);
//delay_init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
// printf("¼ì2aμçÑ1ÖμÎa");
ADCx_Init();
while(1)
{
i++;
if(i%50==0)
{
value1=Get_ADC1_Value(ADC_Channel_9,20);
value=Get_ADC_Value(ADC_Channel_1,20);
//printf("¼ì2aADÖμÎa:%d\r\n",value);
vol=(float)value*(3.3/4096);
vol1=(float)value1 *(3.3/4096);
printf("¼ì2aμçÑ1Öμ1Îa:%.2fV\r\n",vol1);
printf("¼ì2aμçÑ1Öμ2Îa:%.2fV\r\n",vol);
}
delay_ms(10);
}
|
|