本帖最后由 oxygenzz 于 2019-10-28 11:02 编辑
据说正常人清醒状态下的反应时间是0.15s到0.4s,每个人的反应时间都不尽相同,有的快一些,有的慢一些。我们可以使用下面这个单片机实验,简单测量一下自己的反应时间。
外设应用实验:看到Led亮起,立即按下按键,使用SMT外设测量操作者的反应时间。
SMT 全称是Signal Measurement Timer信号测量定时器,是一款24 位计数器,在很多8位PIC单片机上都有配备。SMT 经正确配置后,既可以在没有CPU干预的情况下,自主的对数字信号各种参数进行测量,例如脉冲宽度、频率和占空比,渡越时间(Time Of Flight / TOF)等。SMT更多的使用信息,请参考这个帖子:https://bbs.21ic.com/icview-2736896-1-1.html
设计举例:
1. 硬件采用 PIC16F18446 Curiosity Nano 板。板上正好有一个LED灯和一个按键,分别连到RA2 和 RC2 上。
2. 使用的PIC16F18446 片上外设:TMR2,CLC1,SMT1, EUSART1
TMR2:产生周期为2s的定时信号,这个定时信号的正脉冲只有一个时钟周期宽度 CLC1:将TMR2信号2分频,产生周期4s,DutyCyle 为50%的周期方波信号。这个方波信号从RA2输出,用以驱动LED SMT1:采用TOF(Time Of Flight)测量模式。TOF模式需要两个信号作为输入,一个是发送信号,一个是回波信号。在这个应用中,CLC1输出信号作为发送信号,按键(RC2)信号作为回波信号。SMT1用来检测CLC1的下降沿到RC2引脚按键信号下降沿之间的时间。 EUSART1 用来将测量结果上报。
3. 使用MCC对外设进行配置
4. 在MCC生成的代码工程中,添加少量代码
红色为新添加或修改的代码
在smt1.c 中,
extern bool bTof; //外部变量,标示出是否测量到结果 void SMT1_PR_ACQ_ISR(void) {
// Disabling SMT1 period acquisition interrupt flag bit. PIR8bits.SMT1PRAIF = 0; bTof = true; //标志设为true }
在 main.c中,
boolbTof = false;//定义bTof变量
voidmain (void) { // initialize the device SYSTEM_Initialize();
// When using interrupts, you need to setthe Global and Peripheral Interrupt Enable bits // Use the following macros to:
// Enable the Global Interrupts INTERRUPT_GlobalInterruptEnable();
// Enable the Peripheral Interrupts INTERRUPT_PeripheralInterruptEnable();
// Disable the Global Interrupts //INTERRUPT_GlobalInterruptDisable();
// Disable the Peripheral Interrupts //INTERRUPT_PeripheralInterruptDisable();
while (1) { // Add your application code if(bTof){ bTof =false; uint32_ttemp = SMT1_GetCapturedPeriod(); temp = temp>> 11; printf("Your reaction time this round: %u ms \r\n", temp); } } }
5. 测试
通道1:CLC1输出 通道2:按键信号
我们使用Data Visualizer 中的串口界面来接收测量结果信息:
6. 源代码
|