初级会员

- 积分
- 69
- 金钱
- 69
- 注册时间
- 2018-12-13
- 在线时间
- 10 小时
|
1金钱
本人刚接触stm32的学习想问一下大家 如果stm32F103ADC同时采集正弦电压和电流,需要同时开启ADC1和ADC2吗?还是开启ADC1的两个通道就可以做到,下面是写的ADC部分的代码 期待批评指正!
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;
}
|
最佳答案
查看完整内容[请看2#楼]
使用DR寄存器地址做外设基地址 不需要递增的 DMA_PeripheralInc_Disable这个就行了 测电压的话 一个ADC够了即可
|