LPC804开发(11.ADC使用)

1.前言

刚刚研究ADC的时候发现芯片里面还有应该mrt 16位的定时器没有搞,那回头补上吧。下午研究了一下ADC的使用,我也只是能用上,这里我只是抛砖引玉一下吧,有需要的还请各位自行深入探究,我这里讲解的是软件触发模式。

2.初始化

初始化程序如下

cpp 复制代码
#define ADC_SAMPLE_CHANNEL_NUMBER 7
adc_result_info_t ADCResult;

void init_adc(void)
{
    adc_config_t adcConfigStruct;
    adc_conv_seq_config_t adcConvSeqConfigStruct;

    /* Enables clock for IOCON.: enable */
    CLOCK_EnableClock(kCLOCK_Iocon);
    /* Enables clock for switch matrix.: enable */
    CLOCK_EnableClock(kCLOCK_Swm);

    const uint32_t IOCON_INDEX_PIO0_10_config = (/* No addition pin function */
                                                 IOCON_PIO_MODE_INACT |
                                                 /* Enable hysteresis */
                                                 IOCON_PIO_HYS_EN |
                                                 /* Input not invert */
                                                 IOCON_PIO_INV_DI |
                                                 /* Disables Open-drain function */
                                                 IOCON_PIO_OD_DI);
    /* PIO0 PIN10 (coords: 11) is configured as ADC0, CH, 7. */
    IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_10, IOCON_INDEX_PIO0_10_config);

    /* ADC_CHN7 connect to P0_10 */
    SWM_SetFixedPinSelect(SWM0, kSWM_ADC_CHN7, true);

    /* Disable clock for switch matrix. */
    CLOCK_DisableClock(kCLOCK_Swm);

    /* Attach FRO clock to ADC0. */
    CLOCK_Select(kADC_Clk_From_Fro);
    CLOCK_SetClkDivider(kCLOCK_DivAdcClk, 1U);
    /* Power on ADC. */
    POWER_DisablePD(kPDRUNCFG_PD_ADC0);

    adcConfigStruct.clockDividerNumber = 1;
    adcConfigStruct.enableLowPowerMode = false;

    ADC_Init(ADC, &adcConfigStruct);

    adcConvSeqConfigStruct.channelMask =(1U << ADC_SAMPLE_CHANNEL_NUMBER); /* Includes channel DEMO_ADC_SAMPLE_CHANNEL_NUMBER. */
    adcConvSeqConfigStruct.triggerMask      = 0U;//选择硬件触发源
    adcConvSeqConfigStruct.triggerPolarity  = kADC_TriggerPolarityPositiveEdge;//上升还是下降沿触发
    adcConvSeqConfigStruct.enableSingleStep = false;//单次触发模式
    adcConvSeqConfigStruct.enableSyncBypass = true;//启用此功能允许硬件触发输入绕过同步触发器阶段,从而缩短触发输入信号和转换开始之间的时间。
    adcConvSeqConfigStruct.interruptMode    = kADC_InterruptForEachSequence;//设置中断模式
    ADC_SetConvSeqAConfig(ADC, &adcConvSeqConfigStruct);
    ADC_EnableConvSeqA(ADC, true); /* Enable the conversion sequence A. */
    /* Clear the result register. */
    ADC_DoSoftwareTriggerConvSeqA(ADC);

    while (!ADC_GetChannelConversionResult(ADC, ADC_SAMPLE_CHANNEL_NUMBER, &ADCResult))
    {
    }
    ADC_GetConvSeqAGlobalConversionResult(ADC, &ADCResult);
}

前面几行比较简单,先申请几个配置的结构体

然后是设置引脚,这里我们可以看到这里会多出几行,在模拟引脚我们都需要这样设置,就是配置管脚的速度,默认上下拉,保证是模拟模式,然后关联到相应通道

然后是设置时钟和分频系数,设置完毕后就开通电源

这一部分是设置ADC的分频和低功耗模式

这个结构体里,也只有这两个参数可以设置,在804这里比较鸡肋

这一块是重头戏,我来一个个介绍

第一句话是选择通道,这里我是通道7

第2~4句要连着一起用,常见的示波器都有外部触发功能,这里也可以设置,你可以让ADC的通道2作为外部触发源,你接上方波后对内部ADC进行触发,然后是设置方波极性,上升沿还是下降沿触发,最后一句是设置硬件触发模式,因为这里是软件触发不用硬件所以我直接跳过同步了。

然后是设置中断,因为是软件触发,我就跟着例程走了

配置完毕后就可以使能了,两句话要一起使用

然后是进行一次转换,官方给的说法是清除寄存器里的数据

3.软件触发

程序如下

cpp 复制代码
void ReadADC(void)
{
    /* Get the input from terminal and trigger the converter by software. */
    ADC_DoSoftwareTriggerConvSeqA(ADC);

    /* Wait for the converter to be done. */
    while (!ADC_GetChannelConversionResult(ADC, ADC_SAMPLE_CHANNEL_NUMBER, &ADCResult)){}
}

这里主要介绍一下我们的通道是这个参数,如何改通道就要改这里,当然初始化部分也要改

我们的结果是放在这个结构体内

这个结构体原型如下

result就是我们的读到的数据,是最重要的。中间两是检测ADC的状态,我不怎么常用就没读了。chanelnumber是通道,比如我们这里是通道7,这个数字就是7了。overrunflag是可以检测ADC数据是否存在覆盖的情况,因为芯片内部没有DMA,所以搬运还是依靠CPU来搞,可以通过这个参数查看是否有丢失数据情况。

4.测试

我这里输入是0.8V直流信号

我在程序内部也有进行转换,上面985就是实际读取的值,下面是计算后的电压值,可以看到基本是准的。

相关推荐
清风666666几秒前
基于单片机的汽车尾气智能检测与发动机异常燃烧报警系统
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
诺狞猫26 分钟前
超声波测距装置课程设计报告
单片机·嵌入式硬件·课程设计
国科安芯2 小时前
微小卫星红外相机双MCU冗余架构的抗辐照可靠性评估
人工智能·单片机·嵌入式硬件·数码相机·架构·自动化·安全性测试
电子阿板2 小时前
STM32G0B1 NRST复位和其它IO复用了,如何设置成专用复位引脚,
stm32·单片机·嵌入式硬件
兆龙电子单片机设计2 小时前
【STM32项目开源】STM32单片机智慧农业大棚控制系统
stm32·单片机·物联网·开源·毕业设计
不脱发的程序猿2 小时前
使用Python高效对比多个相似的CAN DBC数据
python·单片机·嵌入式硬件·嵌入式
bai5459362 小时前
STM32 CubeIDE 串口通信
stm32·单片机·嵌入式硬件
国科安芯2 小时前
强辐射环境无人机视频系统MCU可靠性分析
人工智能·单片机·嵌入式硬件·音视频·无人机·边缘计算·安全性测试
代码游侠3 小时前
应用——基于 51 单片机的多功能嵌入式系统
笔记·单片机·嵌入式硬件·学习·51单片机
广药门徒3 小时前
为什么访问一地址存16bits的存储芯片需要字节对齐?为什么访问外部Flash需要字节对齐?——深入理解STM32 FMC的地址映射机制
stm32·单片机·嵌入式硬件