APM32F402R Micro-EVB开发板配有一个12bit ADC数模转换器,可进行多个数据通道的采集。
以3个数据采集通道为例,其信号输入的引脚分别对应PA0~PA2。
它对 ADC的初始化函数为:
void ADC_Init(void)
{
GPIO_Config_T GPIO_ConfigStruct;
ADC_Config_T ADC_ConfigStruct;
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
GPIO_ConfigStructInit(&GPIO_ConfigStruct);
GPIO_ConfigStruct.mode = GPIO_MODE_ANALOG;
GPIO_ConfigStruct.pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
GPIO_Config(GPIOA, &GPIO_ConfigStruct);
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);
ADC_Reset(ADC1);
ADC_ConfigStructInit(&ADC_ConfigStruct);
ADC_ConfigStruct.mode = ADC_MODE_INDEPENDENT;
ADC_ConfigStruct.scanConvMode = ENABLE;
ADC_ConfigStruct.continuousConvMode = ENABLE;
ADC_ConfigStruct.externalTrigConv = ADC_EXT_TRIG_CONV_NONE;
ADC_ConfigStruct.dataAlign = ADC_DATA_ALIGN_RIGHT;
ADC_ConfigStruct.nbrOfChannel = ADC_CH_SIZE;
ADC_Config(ADC1, &ADC_ConfigStruct);
RCM_ConfigADCCLK(RCM_PCLK2_DIV_6);
ADC_ConfigRegularChannel(ADC1, ADC_CHANNEL_0, 1, ADC_SAMPLETIME_13CYCLES5);
ADC_ConfigRegularChannel(ADC1, ADC_CHANNEL_1, 2, ADC_SAMPLETIME_13CYCLES5);
ADC_ConfigRegularChannel(ADC1, ADC_CHANNEL_2, 3, ADC_SAMPLETIME_13CYCLES5);
DMA_Init();
ADC_EnableDMA(ADC1);
ADC_Enable(ADC1);
ADC_ResetCalibration(ADC1);
while (ADC_ReadResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while (ADC_ReadCalibrationStartFlag(ADC1));
ADC_EnableSoftwareStartConv(ADC1);
}
通过串口对采集数据进行输出的函数为:
void ADC_MultiChannelPolling(void)
{
float voltage;
uint8_t index;
for (index = 0; index < ADC_CH_SIZE; index++)
{
voltage = (adcData[index] * 3300.0) / 4095.0;
printf("ADC CH[%d] voltage = %.03f mV\r\n", index, voltage);
}
printf("\r\n");
}
检测多通道数据采集的主程序为:
int main(void)
{
USART_Config_T USART_ConfigStruct;
USART_ConfigStructInit(&USART_ConfigStruct);
USART_ConfigStruct.baudRate = 115200;
USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
USART_ConfigStruct.mode = USART_MODE_TX;
USART_ConfigStruct.parity = USART_PARITY_NONE;
USART_ConfigStruct.stopBits = USART_STOP_BIT_1;
USART_ConfigStruct.wordLength = USART_WORD_LEN_8B;
BOARD_COM_Config(COM1, &USART_ConfigStruct);
ADC_Init();
while (1)
{
ADC_MultiChannelPolling();
Delay(1000);
}
}
经程序的编译和下载,其检测结果如图1所示。
图1 检测结果
在配接TFT显示屏的情况下,其采集数据的显示函数为:
void ADC_MultiChannelPolling(void)
{
float voltage;
uint8_t index;
for (index = 0; index < ADC_CH_SIZE; index++)
{
voltage = (adcData[index] * 3300.0) / 4095.0;
if(index ==0) LCD_ShowNum(60,60,voltage,4);
if(index ==1) LCD_ShowNum(60,90,voltage,4);
if(index ==2) LCD_ShowNum(60,120,voltage,4);
}
}
测试采集数据显示效果的主程序为:
int main(void)
{
BOARD_TFT_Config();
tft_Init();
LCD_Clear(RED);
BACK_COLOR=RED;
POINT_COLOR=YELLOW;
LCD_ShowString(120,10,"APM32F402");
POINT_COLOR=WHITE;
LCD_DrawLine(0, 30, 319, 30);
LCD_DrawLine(0, 210, 319, 210);
POINT_COLOR=YELLOW;
LCD_ShowString(20,60,"ch0: mV ");
LCD_ShowString(20,90,"ch1: mV ");
LCD_ShowString(20,120,"ch2: mV ");
ADC_Init();
while (1)
{
ADC_MultiChannelPolling();
Delay(1000);
}
}
经程序的编译和下载,其检测结果如图2所示。
图2 显示效果
|