嵌入式技术论坛
直播中

李娟

7年用户 1352经验值
私信 关注
[经验]

Timer0的周期定时+ADC读取功能测试详解

1、Timer详解

1)Numaker-lot-M487有4个32位精度的时钟,Timer0到Timer3,每个时钟存在24位的向上计数器和8位的预分频器。

2)每个定时器的独立时钟源

3)提供单次、周期、外部触发和连续计数操作模式

4)24位向上计数器值,可通过CNT寄存器进行读取
(TIMERx_CNT[23:0])

5)支持事件计数功能

6)24位捕获值可通过CAPDAT寄存器进行读取
(TIMERx_CAP[23:0])

7)支持引脚外部捕获事件的间隔测量

8)支持外部捕获引脚事件复位24位计数器

9)Idle/Power-down模式下如定时器中断信号产生可进行芯片唤醒

10)支持Timer0 ~ Timer3的超时中断信号或捕获中断信号来触发EPWM, BPWM, QEI, EADC, DAC和PDMA功能

11)支持内部捕获触发,同时内部ACMP输出信号转换

12)支持内部时钟(HIRC、LIRC)和外部时钟(HXT、LXT),用于捕获事件

13)支持Inter-Timer触发方式

13)支持从内部USB SOF信号事件计数源

2、测试内容

本次测试Timer0的周期定时+ADC读取功能。

即每5s读取一次ADC0通道0的ADC值。

3、测试代码

#define REFER_VOLTAGE 330 /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS (1 << 12) /* 转换位数为12位 /
#define TIMER_DEV_NAME "timer0" /
定时器名称 /
rt_device_t tim_dev; /
定时器设备句柄 /
rt_hwtimer_mode_t tim_mode; /
定时器模式 /
rt_hwtimerval_t timeout_s; /
定时器超时值 /
#define ADC_DEV_NAME "eadc0" /
ADC 设备名称 /
#define ADC_DEV_CHANNEL 0 /
ADC 通道 /
rt_adc_device_t adc_dev; /
ad设备句柄 /
rt_uint32_t value = 0;
/
定时器超时回调函数 /
static rt_err_t timeadc_cb(rt_device_t dev, rt_size_t size)
{
rt_uint32_t vol = 0;
/
使能设备 /
rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
/
读取采样值 /
value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
/
转换为对应电压值 /
vol = value * REFER_VOLTAGE / CONVERT_BITS;
rt_kprintf("this is hwtimer timeout callback fucntion!\n");
rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
rt_kprintf("tick is :%d !\n", rt_tick_get());
/
关闭通道 */
rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
return 0;
}
static int timer_adc(int argc, char argv[])
{
/
查找定时器设备 /
tim_dev = rt_device_find(TIMER_DEV_NAME);
/
以读写方式打开设备 /
rt_device_open(tim_dev, RT_DEVICE_OFLAG_RDWR);
/
设置超时回调函数 /
rt_device_set_rx_indicate(tim_dev, timeadc_cb);
/
设置模式为周期性定时器 /
tim_mode = HWTIMER_MODE_PERIOD;
rt_device_control(tim_dev, HWTIMER_CTRL_MODE_SET, &tim_mode);
/
设置定时器超时值为5s并启动定时器 /
timeout_s.sec = 5; /
/
timeout_s.usec = 0; /
微秒 /
rt_device_write(tim_dev, 0, &timeout_s, sizeof(timeout_s));
/
查找ad设备 */
adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
return 0;
}
MSH_CMD_EXPORT(timer_adc, time function);

4、结果

在FINSH控制台下,查看设备,Timer例程的Mesh命令已经出现。

1.jpg

输入timer_adc指令后,激活每5s读取一次ADC值并转换为电压值。

1.jpg

2.jpg

每隔5s打印一次检测到的电压值。

原作者:werper

更多回帖

发帖
×
20
完善资料,
赚取积分