查看: 3451|回复: 0

[分享] [LPC54110开发板测试] 三、Tick和ADC实验

[复制链接]
  • TA的每日心情
    开心
    2017-3-31 13:54
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    6

    主题

    12

    帖子

    0

    新手上路

    Rank: 1

    积分
    48
    最后登录
    2017-5-20
    发表于 2017-4-28 22:28:32 | 显示全部楼层 |阅读模式
    [LPC54110开发板测试] 三、Tick和ADC实验
    将二中的mainLed.c复制一个改名为mainAdc.c,打开这个文件进行编辑。
    先打开adc_5411x.h理解ADC的定义,关于Chip_ADC_Init函数有一堆说明,按照理解和尝试,将主函数中的adcInit编写如下:
    void adcInit(void){//    0,1,2,3=6-12b         0-FF
    Chip_ADC_Init(LPC_ADC, ADC_CR_RESOL(0)|ADC_CR_CLKDIV(0));
    //                                            =0                1UL<<31                        3
    Chip_ADC_SetSequencerBits(LPC_ADC, ADC_SEQA_IDX, ADC_SEQ_CTRL_SEQ_ENA | ADC_SEQ_CTRL_CHANNEL_EN(3) | ADC_SEQ_CTRL_START);
                                    //                             PIO1  Ain0        Function3      (0x0 << 3)Enables analog function by setting 0 to bit 7
    Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 0, (IOCON_FUNC7 | IOCON_MODE_INACT |IOCON_ANALOG_EN));
    Chip_ADC_Calibration(LPC_ADC);
    }
    这个ADC初始化函数不能提供ADC采样,需要在程序中触发采样,因此编写一段adcTest函数:
    //ADC Sample once
    void adcTest(void){
    Chip_ADC_StartSequencer(LPC_ADC,ADC_SEQA_IDX);
    if(Chip_ADC_GetFlags(LPC_ADC)){
    val0=(Chip_ADC_GetGlobalDataReg(LPC_ADC,ADC_SEQA_IDX)&ADC_SEQ_GDAT_RESULT_MASK)>>ADC_SEQ_GDAT_RESULT_BITPOS;
    }

    }
    在main主函数中调用1次,得到1次ADC采样的数据,赋值给adcVal0变量,因此在变量定义增加:
    uint16_t ledTime=2000,val0;
    在main函数中增加:
    adcInit();
    在while循环中增加:
    ledTest();
    js++;
    adcTest();
    printf("JSQ:%d ADC=%d \n\r",js,adcVal0);
    程序编译后下载,在电脑虚拟串口中看到的采样数据脚图31。
    ADC采样受控于主函数,可以将它改为由TICK时钟中断采样,这样主函数可以不用管ADC的工作。先定义一个Tick常数[数值越大,ADC采样速率越快]:
    //Definitions
    #define tickRate (10)//Biger is Fast
    将ADC初始化改为:
    void adcInit(void){
    Chip_ADC_Init(LPC_ADC, ADC_CR_RESOL(0) | ADC_CR_CLKDIV(0));
    Chip_ADC_SetSequencerBits(LPC_ADC, ADC_SEQA_IDX, ADC_SEQ_CTRL_SEQ_ENA | ADC_SEQ_CTRL_CHANNEL_EN(3) | ADC_SEQ_CTRL_START);
    Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 0, (IOCON_FUNC7 | IOCON_MODE_INACT |IOCON_ANALOG_EN)); Chip_ADC_EnableInt(LPC_ADC, ADC_INTEN_SEQA_ENABLE);
    Chip_ADC_Calibration(LPC_ADC);
    NVIC_EnableIRQ(ADC_SEQA_IRQn);
    }
    删除adcTest函数,增加TICK函数:
    //TimeTick Interrupt
    void SysTick_Handler(void){Chip_ADC_StartSequencer(LPC_ADC, ADC_SEQA_IDX);
    }
    增加ADC中断执行函数:
    void ADC_SEQA_IRQHandler(void){
    if(Chip_ADC_GetFlags(LPC_ADC) & ADC_FLAGS_SEQA_INT_MASK){
      adcVal0=(Chip_ADC_GetGlobalDataReg(LPC_ADC, ADC_SEQA_IDX) & ADC_SEQ_GDAT_RESULT_MASK) >> ADC_SEQ_GDAT_RESULT_BITPOS;}
    }
    删除主函数中关于adc采样的调用,编译下载后的结果见图32。为了测试tickRate对ADC采样的影响,我们做一改动:将持续计数器js++;放到ADC中断函数中,分别设置tickRate位10和1000是的虚拟串口得到的数值,1000时,的计数都不是连续的——主函数输出打印显示。见图33、34。

    31-ADC采样串口显示数据.JPG
    32-由TICK中断获得的ADC串口显示值.JPG

    33

    33

    34

    34
    开心每一天
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-25 08:51 , Processed in 0.087155 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表