基于MSP432P410R的HC-SR04超声波程序

目录

代码

总结


代码

//HCSR04.h配置

#ifndef _HCSR04_H
#define _HCSR04_H

#include  "main.h" 

void HCSR04Init(void);
float Distance(void);


#endif
//HCSR04.c配置

#include "HCSR04.h"

#include "main.h"



const Timer_A_UpModeConfig upConfig =
{
        TIMER_A_CLOCKSOURCE_SMCLK,              // SMCLK Clock Source
        TIMER_A_CLOCKSOURCE_DIVIDER_3,          // SMCLK/1 = 3MHz
        50000,                           // 5000 tick period
        TIMER_A_TAIE_INTERRUPT_DISABLE,         // Disable Timer interrupt
        TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE,    // Enable CCR0 interrupt
        TIMER_A_DO_CLEAR                        // Clear value
};

void HCSR04Init(void)
{

    MAP_GPIO_setAsOutputPin(GPIO_PORT_P9, GPIO_PIN2);//tring
	MAP_GPIO_setAsInputPin(GPIO_PORT_P5, GPIO_PIN3); 
	
    MAP_GPIO_setAsInputPinWithPullDownResistor(GPIO_PORT_P5, GPIO_PIN3);
    
	MAP_GPIO_disableInterrupt(GPIO_PORT_P9, GPIO_PIN2);
    MAP_GPIO_disableInterrupt(GPIO_PORT_P5, GPIO_PIN3);

    MAP_Timer_A_configureUpMode(TIMER_A2_BASE, &upConfig);

    MAP_Interrupt_enableSleepOnIsrExit();
    MAP_Interrupt_enableInterrupt(INT_TA1_0);
    MAP_Timer_A_startCounter(TIMER_A2_BASE, TIMER_A_UP_MODE);
    
    MAP_Interrupt_enableMaster();  

}
void TA1_0_IRQHandler(void)
{

    MAP_Timer_A_clearCaptureCompareInterrupt(TIMER_A2_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_0);
//	Timer_A_getCounterValue(uint32_t timer);
	
}

float Distance(void)
{
	int count=0,i=0,sum=0;
	float distance=0;
	while(i!=5)
	{
	 GPIO_setOutputLowOnPin(GPIO_PORT_P9, GPIO_PIN2);//上拉
		GPIO_setOutputHighOnPin(GPIO_PORT_P9, GPIO_PIN2);//上拉
		delay_us(10);
		GPIO_setOutputLowOnPin(GPIO_PORT_P9, GPIO_PIN2);//上拉
        TIMER_A_CMSIS(TIMER_A2_BASE)->R = 0;
		while(GPIO_getInputPinValue(GPIO_PORT_P5,GPIO_PIN3) == 0);	//
		MAP_Interrupt_enableInterrupt(INT_TA1_0);
		while(GPIO_getInputPinValue(GPIO_PORT_P5,GPIO_PIN3) == 1);  //
        MAP_Interrupt_disableInterrupt(INT_TA1_0);
		count=TIMER_A_CMSIS(TIMER_A2_BASE)->R;
		//v = 340m/s = 34000cm/s = 34000cm/10^6us = 0.034cm/us
		//s = vt/2 = t*0.034/2 = t*0.017 ?t/58	
		distance=((float)count / 58);	
		i++;
		sum=sum+distance;
	}
		return sum/5;
}
//main.c配置

#include  "main.h"
#include "HCSR04.h"
#include  "string.h"
#include "stdio.h"
/*  全局变量申明区  */
// u8  a=0;
// u16 len ;
/* 函数调用申明区 */


int main(void)
{ 
    int Distance1;
    WDT_A_holdTimer();
    GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);//led灯
    SystemClockInit(HFXT);//系统时钟初始化(系统主时钟)
    SystemClockInit(DCO);//系统时钟初始化(子系统时钟)
	Usart1tInit(); //串口1 初始化
	HCSR04Init();
    LedInit();
    while(1)
    {
        Distance1= Distance();
        GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN1);
        printf("Distance = %dmm\r\n",Distance1);    
        delay_ms(50);
    }
		

}
			


总结

HC-SR04超声波的配置程序还是很简单的,但是相比STM32,MSP432使用HC-SR04测量出来的距离超过20CM之后就不准确了,原因暂时未知,可能是定时器频率的问题,还有待研究。

工程链接:基于MSP432P410R的HC-SR04超声波程序.zip

你可能感兴趣的:(MSP432P401R,keil,mdk,msp)