初级会员

- 积分
- 57
- 金钱
- 57
- 注册时间
- 2014-4-18
- 在线时间
- 0 小时
|

楼主 |
发表于 2014-5-8 18:49:40
|
显示全部楼层
回复【6楼】ljjdglg520:
---------------------------------
对,是你说的那样,在进行通道转换之前都要配置规则通道然后再使能ADC启动转换。网上也基本都是这么做的,但是回过头来想想,这种实现方法实质上还是单通道实现ADC采样。难道规则多通道ADC采样的实现方法必须使用DMA。我把实现代码贴在下面,供大家批评指正:
ADC多通道采样非DAM方式实现方法:
1.ADC初始化部分(注意只是一部分,GPIO、时钟都没有贴出来)
/*初始化ADC1*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
/*使能ADC1*/
ADC_Cmd(ADC1, ENABLE);
/*重置指定的ADC的校准寄存器*/
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
/*开始指定ADC的校准程序*/
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
2.转换函数:
u16 ADC1_GetValue(u8 channel)
{
u32 value;
ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_55Cycles5);
ADC_Cmd(ADC1, ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
value = ADC_GetConversionValue(ADC1);
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
return (u16)value;
}
在本函数中只需要传入通道号就可以实现该通道数据的采集。如果不想传入通道号,还可以,在本函数中写个循环,对所有通道进行读取。 |
|