完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
/*
* 超声模块测距代码 */ #ifndef PART_TM4C123GH6PM #define PART_TM4C123GH6PM #ifndef DOXYGEN #define DOXYGEN #include #include #include"stdio.h" #include"stdlib.h" #include"math.h" #include"inc/hw_memmap.h" //#include"inc/hw_types.h" #include"inc/hw_ints.h" #include"driverlib/gpio.h" #include"driverlib/pin_map.h" #include"driverlib/pwm.h" #include"driverlib/sysctl.h" #include"driverlib/uart.h" #include"driverlib/timer.h" #include"driverlib/interrupt.h" const double HEIGHT = 0.3; unsigned char flag; unsigned char RiseTime; //记录超声测距模块echo端高电平出现时的时钟 void Timer0AIntHandler(); int main(void) [ flag = 0; SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); //配置时钟,但是需要查看自己板子上的晶振 //timer and interrupt SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); // 启用Timer0模块 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); // 启用PF0作为脉冲捕捉脚 GPIOPinConfigure(GPIO_PF0_T0CCP0); // 配置GPIO脚为使用Timer0捕捉模式 GPIOPinTypeTimer(GPIO_PORTF_BASE, GPIO_PIN_0); GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_OD); // 为管脚配置开漏模式 TimerConfigure(TIMER0_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME); // 配置使用Timer0的TimerA模块为边沿触发减计时计数模式 TimerControlEvent(TIMER0_BASE, TIMER_A, TIMER_EVENT_BOTH_EDGES); // 使用边沿触发 TimerLoadSet(TIMER0_BASE, TIMER_A, 0x7d00); //设置计数范围为32000到0,为2ms,最长可以测0.7m,超声测距了 TimerIntRegister(TIMER0_BASE, TIMER_A, Timer0AIntHandler); // 注册中断处理函数以响应触发事件 IntMasterEnable(); // 系统总中断开 TimerIntEnable(TIMER0_BASE, TIMER_CAPA_EVENT); // 时钟中断允许,中断事件为Capture模式中边沿触发 IntEnable(INT_TIMER0A); // NVIC中允许定时器A模块中断 //触发超声模块启动的引脚PF1 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);//Enable the port GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_4); //配置输出端口PF1 //led SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); TimerEnable(TIMER0_BASE, TIMER_A); // 启动捕捉模块 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0x10); SysCtlDelay(160/3); //延时10微秒 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0x00); SysCtlDelay(SysCtlClockGet() / 3); //延时1s if(flag == 1) return 0; //GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, 0x00); ] //注册中断函数 void Timer0AIntHandler() [ GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, 0xFF); if(GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_0) | 0xFE == 0xFF)RiseTime = TimerValueGet(TIMER0_BASE, TIMER_A); else [ uint32_t time = TimerValueGet(TIMER0_BASE, TIMER_A) > RiseTime ? RiseTime + 32000 - TimerValueGet(TIMER0_BASE, TIMER_A) : RiseTime - TimerValueGet(TIMER0_BASE, TIMER_A); if(time * 34 > (uint32_t)(HEIGHT * 1600000)) [ GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, 0xFF); flag = 1; ] else [ GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, 0x02); flag = 1; ] SysCtlDelay((unsigned char)(SysCtlClockGet() / 3 * 5)); ] TimerIntClear(TIMER0_BASE, TimerIntStatus(TIMER0_BASE, TIMER_CAPA_EVENT)); //清除中断 ] #endif #endif |
|
相关推荐
9 个讨论
|
|
只有小组成员才能发言,加入小组>>
598 浏览 0 评论
1651 浏览 0 评论
2090 浏览 0 评论
为啥BQ7693003DBTR芯片在和BQ769X0盒子通讯时收不到信号?
1541 浏览 0 评论
DSP 28027F 开发板 XDS100v2调试探针诊断日志显示了 Error -150 (SC_ERR_FTDI_FAIL)如何解决
1383 浏览 0 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
1793浏览 29评论
2820浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
1748浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
1666浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
1680浏览 13评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-13 16:42 , Processed in 1.090897 second(s), Total 79, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3204