在线时间444 小时
UID271205
注册时间2016-10-4
NXP金币6050
TA的每日心情 | 开心 昨天 09:48 |
---|
签到天数: 971 天 连续签到: 11 天 [LV.10]以坛为家III
金牌会员
 
- 积分
- 7747
- 最后登录
- 2025-8-26
|
一直想用定时器定时自动触发一次ADC采样
在手册中找到ADC可以有多种硬件触发功能,其中就有用LPTMR0触发
Let's go!
建立工程,在SDK中选择LPTMR和ADC
路由ADC,这了选择了12#引脚(ADC0_SE7a),并设置TRG,A,触发源选择为Low_Power_Timer,也就是LPTMR
设置LPTMR,这里方便观察,设置为2Hz,即500ms采样一次(如果频率更高,使用上DMA,可以实现低频的示波器了)
设置ADC,激活连续采样,分组设置,中断(采样后获取数据显示出来)
代码:
- uint32_t ADC_FullRange = 0x8000;
- /* ADC0_IRQn interrupt handler */
- void ADC0_IRQHANDLER(void) {
- /* Array of result values*/
- uint32_t result_values[2] = {0};
- uint16_t AD_Volt;
- float Volt = 0.0f;
- PRINTF("ADC conver finish.");
- /* Get flags for each group */
- for ( int i=0; i<2; i++){
- uint32_t status = ADC16_GetChannelStatusFlags(ADC0_PERIPHERAL, i);
- if ( status == kADC16_ChannelConversionDoneFlag){
- result_values[i] = ADC16_GetChannelConversionValue(ADC0_PERIPHERAL, i);
- AD_Volt = result_values[i];
- Volt = 3.3 * AD_Volt / ADC_FullRange; // 计算对应电压值
- PRINTF("Channel %d ADC Value: %d Volt Value: %f\r\n",i,AD_Volt,Volt);
- }
- }
- }
- /*
- * @brief Application entry point.
- */
- int main(void) {
- /* Init board hardware. */
- BOARD_InitBootPins();
- BOARD_InitBootClocks();
- BOARD_InitBootPeripherals();
- #ifndef BOARD_INIT_DEBUG_CONSOLE_PERIPHERAL
- /* Init FSL debug console. */
- BOARD_InitDebugConsole();
- #endif
- /* Start the LPTMR timer */
- PRINTF("This project is LPTMR0 trigger ADC0.\r\n");
- /* Force the counter to be placed into memory. */
- volatile static int i = 0 ;
- /* Enter an infinite loop, just incrementing a counter. */
- while(1) {
- i++ ;
- /* 'Dummy' NOP to allow source level single stepping of
- tight while() loop */
- __asm volatile ("nop");
- }
- return 0 ;
- //SDK_ISR_EXIT_BARRIER;
- /* Place your code here */
- /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F
- Store immediate overlapping exception return operation might vector to incorrect interrupt. */
- /* #if defined __CORTEX_M && (__CORTEX_M == 4U)
- __DSB();
- #endif*/
- }
复制代码
效果,悬空了端子,自由采样。
|
|