本帖最后由 suncat0504 于 2024-7-25 22:36 编辑
昨天的测试没有成功,用示波器观察,估计是A153的驱动能力不足。在这个基础上,对驱动部分使用SN75451来增强驱动,使用面包板临时搭建的。驱动部分的电路,简单绘制如下:
输出端1Y和2Y接了8.2K的上拉电阻,因为SN75451的输出是悬空的。
虽然设置了A153的P3_30和P_31为上拉电阻的方式,但是作用,示波器没有测到触发信号个回应信号。 在调整好程序,连接好电路后,
测试有了结果,但是很奇怪,数值保持不变。哪怕用手在超声波模块的前面前后移动,测量的结果也没有变化。坐下来,看着电路,想了想,觉得很可能是超声波模块插在面包板上,离面包板太近。于是适当拔出一些,并让超声波的探头斜向上抬高点角度,测量数据就开始正常变化了。感觉测得的结果也算正常。用手前后移动测试,能体现出距离的变化了。
示波器上的测量结果,如图所示:
黄色信号是测量的触发信号,粉色的是测量超声波的回应信号。 主程序如下: - int main(void) {
- uint32_t currentCounter = 0U; // 当前计数值
- lptmr_config_t lptmrConfig; // 定时器设置
- double juli = 0;
- uint32_t inp = 0;
- uint32_t tmcnt = 0;
- // 使能GPIO3口时钟
- CLOCK_EnableClock(kCLOCK_GateGPIO3);
- /* attach FRO 12M to LPUART0 (debug console) */
- CLOCK_SetClockDiv(kCLOCK_DivLPTMR0, 1u);
- CLOCK_AttachClk(kFRO12M_to_LPTMR0);
- CLOCK_SetupFRO16KClocking(kCLKE_16K_SYSTEM | kCLKE_16K_COREMAIN);
- // 初始化GPIO口
- BOARD_InitPins();
- BOARD_InitBootClocks();
- BOARD_InitDebugConsole();
- // 设置LED使用的GPIO口为输出方式,关闭LED
- LED_INIT();
- GPIO_PinWrite(GPIO3, 30U, 0); // 设置P3_30输出为0,只有需要测距时,才能触发为高电平
- GPIO3->PDDR |= (1U << 30U); // 使P3_30为输出模式(不设置,则默认为输入模式)
- // 设置定时器
- /* Configure LPTMR */
- /*
- * lptmrConfig.timerMode = kLPTMR_TimerModeTimeCounter; // 默认值:脉冲计数
- * lptmrConfig.pinSelect = kLPTMR_PinSelectInput_0; // 脉冲来源:输入0
- * lptmrConfig.pinPolarity = kLPTMR_PinPolarityActiveHigh; // 脉冲极性:上升沿,高电平
- * lptmrConfig.enableFreeRunning = false; //
- * lptmrConfig.bypassPrescaler = true;
- * lptmrConfig.prescalerClockSource = kLPTMR_PrescalerClock_1;
- * lptmrConfig.value = kLPTMR_Prescale_Glitch_0;
- */
- LPTMR_GetDefaultConfig(&lptmrConfig);
- /* Initialize the LPTMR */
- LPTMR_Init(DEMO_LPTMR_BASE, &lptmrConfig);
- /*
- * Set timer period. 设置优先级
- * Note : the parameter "ticks" of LPTMR_SetTimerPeriod should be equal or greater than 1.
- */
- LPTMR_SetTimerPeriod(DEMO_LPTMR_BASE, USEC_TO_COUNT(LPTMR_USEC_COUNT, LPTMR_SOURCE_CLOCK));
- // 允许LPTMR中断
- LPTMR_EnableInterrupts(DEMO_LPTMR_BASE, kLPTMR_TimerInterruptEnable);
- /* Enable at the NVIC : 开中断? */
- EnableIRQ(DEMO_LPTMR_IRQn);
- PRINTF("Low Power Timer Example\r\n");
- // 开始计数
- LPTMR_StartTimer(DEMO_LPTMR_BASE);
- while (1) {
- // 是否可以测试了?
- if (trigFlag == 0) {
- // 是,可以测试了
- PRINTF("Start Test ! ");
- trigCounter = 0;
- // 发出触发脉冲
- GPIO_PinWrite(GPIO3, 30U, 1);
- while (1) {
- // 保证脉冲超过10微秒(定时器周期为60微秒,所以计数一次就够用了)
- if (trigCounter>0) {
- // 停止触发
- GPIO_PinWrite(GPIO3, 30U, 0);
- // 退出
- break;
- }
- }
- // 检查P3_31是否变成高电平
- while (1) {
- inp = GPIO_PinRead(GPIO3, 31U);
- // 超声波模块的回应端是否变成高电平了?
- if (inp==1 && trigFlag==0) {
- // 是,建立阶段标志
- trigFlag = 1;
- // 清除测量时间用的变量值
- trigCounter = 0;
- LED_TOGGLE();
- }
- if ((inp==0 && trigFlag==1)) {
- LED_TOGGLE();
- // 缓存测量及时值
- tmcnt = trigCounter;
- // 清除延迟计数
- waitNextCounter = 0;
-
- // 计算距离数据(单位:毫米) = (0.34 * 时间(微秒)/2 )
- juli = 0.17 * 61 * tmcnt;
- PRINTF("tm=%d distance = %d \r\n", tmcnt, (long)juli);
- break;
- }
- // 超时了,重新开始测量
- if (trigCounter == 10000) {
- PRINTF("Timerover ! \r\n");
- waitNextCounter = 0;
- break;
- }
- }
- // 延迟一段时间,保证下次测量可以正常执行(要大于60模式)
- // 这里定时器为61微秒,所以等待累计1000次,达到60毫秒
- while (1) {
- if (waitNextCounter > 5000) {
- trigFlag=0;
- break;
- }
- }
- }
- }
- }
复制代码
|