在线时间2 小时
UID3363956
注册时间2017-3-19
NXP金币0
TA的每日心情 | 开心 2017-3-31 13:54 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
新手上路

- 积分
- 48
- 最后登录
- 2017-5-20
|
[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。
|
|