本帖最后由 雪孩爱雪 于 2020-11-28 16:11 编辑
ADC即模拟数字转换器(英语:Analog-to-digital converter)是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。一个模拟数字转换器可以提供信号用于测量。与之相对的设备成为数字模拟转换器。 ADC的作用是将连续变化的模拟信号转换为离散的数字信号。 NXP提供的LPC55S69资料例子是单通道ADC,运行没问题,但是多通道ADC采样就有问题。多通道ADC需要按照以下配置方式。 一、引脚。 二、外设。 添加ADC外设。 通用配置。 命令1。 命令2。 命令3。 触发0。 触发1。 触发2。 触发3。 中断配置默认即可。
说明。 一个命令对应一个触发,触发中的Target Comand ID就是对应于命令中的Comand ID。 理论上3个命令是对应3个触发,但是这里用了4个触发(可能是固件库的问题)。 第4个触发和第3个触发是一样的功能,只是触发号不同。 三、代码。 在上一步配置完成了,需要点击“更新源代码”。 这样,peripherals.c会按照之前的配置更新,这个是只读文件,不能直接在该文件中修改,需要在”外设“、”引脚“、”时钟“、”TEE“,四个配置窗口中修改,再更新过来。 第一个图片是开发,就是写代码的界面,第二个是”引脚“,第三个是”时钟“,第四个是”外设“,第五个是”TEE“。 修改工程中Source中的源文件,根据你的工程名不同而不同。 int main(void) {
lpadc_conv_result_t mLpadcResultConfigStruct;
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
BOARD_InitPins();
BOARD_BootClockPLL150M();
BOARD_InitDebugConsole();
BOARD_InitBootPeripherals();
CLOCK_SetClkDiv(kCLOCK_DivAdcAsyncClk, 16U, true);
CLOCK_AttachClk(kMAIN_CLK_to_ADC_CLK);
POWER_DisablePD(kPDRUNCFG_PD_LDOGPADC);
PRINTF("Please press any key to get user channel's ADC value.\r\n");
while (1) {
GETCHAR();
LPADC_DoSoftwareTrigger(ADC0_PERIPHERAL, 1U); /* 1U对应触发0*/
while (!LPADC_GetConvResult(ADC0_PERIPHERAL, &mLpadcResultConfigStruct, 0U)) {}
if(mLpadcResultConfigStruct.triggerIdSource == 0) { /*触发0的结果*/
PRINTF("CH0 ADC0_P PIO0_23: %d\r\n", ((mLpadcResultConfigStruct.convValue) >> 3U));
}
LPADC_DoSoftwareTrigger(ADC0_PERIPHERAL, 2U); /* 2U对应触发1*/
while (!LPADC_GetConvResult(ADC0_PERIPHERAL, &mLpadcResultConfigStruct, 0U)) {}
if(mLpadcResultConfigStruct.triggerIdSource == 1) {
PRINTF("CH2 PIO0_15_GPIO_ARD PIO0_15: %d\r\n", ((mLpadcResultConfigStruct.convValue) >> 3U));
}
LPADC_DoSoftwareTrigger(ADC0_PERIPHERAL, 4U); /* 4U对应触发3*/
while (!LPADC_GetConvResult(ADC0_PERIPHERAL, &mLpadcResultConfigStruct, 0U)) {}
if(mLpadcResultConfigStruct.triggerIdSource == 2)
PRINTF("CH12 PIO1_9_GPIO_ARD PIO1_9: %d\r\n", ((mLpadcResultConfigStruct.convValue) >> 3U));
}
}
}
点击Debug,调试。 在控制台中,输入个回车。 得到ADC采样的数据,这里没有转换为电压。参考电压是3.3V。 LPC55S69的内部温度传感器也是用ADC实现的,可以使用官方提供的例子。
|