新手上路
- 积分
- 46
- 金钱
- 46
- 注册时间
- 2014-1-3
- 在线时间
- 0 小时
|
我想用STM32实现ADC双通道数据采集并把采集到的数据不断的打印到串口。
程序如下:
void ADC1_GPIO_config(void)
{
GPIO_InitTypeDef GPIO_Initstructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOC,ENABLE);
GPIO_Initstructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;
GPIO_Initstructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOC,&GPIO_Initstructure);
}
void ADC1_config(void)
{
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
//配置DMA
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 = 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);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //配置ADC
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 = 2;
ADC_Init(ADC1, &ADC_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div8); //配置ADC时钟
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5); //配置ADC通道
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_55Cycles5); //配置ADC通道
ADC_DMACmd(ADC1, ENABLE); //使能DMA
ADC_Cmd(ADC1,ENABLE); //使能ADC
ADC_ResetCalibration(ADC1); //复位校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位完成
ADC_StartCalibration(ADC1); //开始校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准完成
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发
DMA_Cmd(DMA1_Channel1, ENABLE);
}
void ADC1_init()
{
ADC1_GPIO_config();
ADC1_config();
}
int main(void)
{
u16 i;
delay_init();
  WM_init();
usart_config(115200);
ADC1_init();
while(1)
{
ADC_ConvertedValueLocal=(float) ADC_ConvertedValue[0]/4096*3.3;
printf("\r\n The current V1=%f V \r\n",ADC_ConvertedValueLocal);
ADC_ConvertedValueLocal=(float) ADC_ConvertedValue[1]/4096*3.3;
printf("\r\n The current V2=%f V \r\n",ADC_ConvertedValueLocal);
delay_ms(1000);
}
}
程序参考网上的,输出结果不正确:有一路通道没有加电压,却偶尔会显示有电压,是不是数据发生错位?另外想问一下,DMA是什么时候将数据从外设转至内存,我想让ADC_ConvertedValue[0]显示通道1的电压,ADC_ConvertedValue[1]显示通道2的电压,但是ADC1的通道都共用ADC_DR寄存器,如何保证让DMA传一次ADC1通道1的数据下次传ADC1通道2的数据,而不是连着传两次ADC1通道1的数据。
|
|