LPC804开发(11.ADC使用)

1.前言

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

2.初始化

初始化程序如下

#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.软件触发

程序如下

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就是实际读取的值,下面是计算后的电压值,可以看到基本是准的。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lpc2114/2124/2212/2214 是一系列由恩智浦公司(NXP)开发的 ARM 微控制器。以下是这些芯片的使用指南: 1. 芯片概述:lpc2114/2124/2212/2214 是基于 ARM7 内核的低功耗微控制器。它们具有高性能和丰富的外设功能,适用于各种应用领域。 2. 内核架构:这些芯片采用了 ARM7 内核,具有较高的运算速度和较低的功耗。它们支持 32 位指令集,并集成了许多功能模块,如中断控制器、定时器和串行通信接口等。 3. 外设功能:lpc2114/2124/2212/2214 在外设方面具有丰富的功能。它们提供多个 UART、SPI 和 I²C 接口,可实现与其他设备的高速通信。此外,它们还集成了模拟数字转换器(ADC)、数字模拟转换器(DAC)和 PWM 控制器等,可用于数据采集、信号处理和电机控制等应用。 4. 开发工具:为了便于开发者的使用,恩智浦公司提供了一套完整的开发工具链。其中包括编译器、调试器和开发板等。开发者可以使用这些工具进行软件开发、调试和测试。 5. 编程语言:对于这些芯片的软件开发,一般使用 C 或汇编语言。开发者可以利用编译器和开发工具链来编写和调试代码。同时,恩智浦公司也提供了大量的示例代码和应用程序,供开发者参考和使用。 6. 资源支持:为了帮助开发者更好地使用这些芯片,恩智浦公司提供了丰富的技术文档和支持资料。开发者可以在公司的官方网站上找到有关硬件规格、编程手册和应用笔记等资料。 总之,lpc2114/2124/2212/2214 是一系列功能丰富、性能卓越的 ARM 微控制器。通过充分利用这些芯片的外设功能和开发工具链,开发者可以快速开发出高质量的嵌入式应用。同时,恩智浦公司提供的技术文档和支持资料也能够为开发者提供必要的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值