This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C123GH6PM: HC-SR04 Ultrasonic Module

Part Number: TM4C123GH6PM

Hi Team,

volatile uint32_t time = 0;
volatile uint32_t Distance = 0;

void HC_SR04_Init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
//enable GPIO_B
GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_4);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_5);
GPIOPinWrite(GPIO_PORTB_BASE ,GPIO_PIN_5 ,0);
}

void Timer0A_Handler(void) {

static uint32_t time_count=0;
//Read Timer Interrupt Status 
uint32_t status=TimerIntStatus( TIMER0_BASE, true);
//Clear interrupt flag bit 
TimerIntClear( TIMER0_BASE, status);
time ++;
}
uint32_t sonar_mm(void )
{

GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, GPIO_PIN_5);//Trig high
delay_us(18);
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0);
while(GPIOPinRead(GPIO_PORTB_BASE ,GPIO_PIN_4) == 0); //Wait for low end 
time=0;
while(GPIOPinRead(GPIO_PORTB_BASE ,GPIO_PIN_4) == 1)
{
;
}

Distance=(time*346)/2; //Calculate the distance, and sound velocity in 25°C air is 346 m/s. 

return Distance ;
}
void Timer_Init(void) {
//enable TIMER0,16/32bit
SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0);
//Configure the timer, split the timer, and configure Timer a after the timer to be periodic 
TimerConfigure( TIMER0_BASE, TIMER_CFG_SPLIT_PAIR|TIMER_CFG_A_PERIODIC_UP);

TimerLoadSet( TIMER0_BASE, TIMER_A,
SysCtlClockGet()/100000-1);//1us
//Register the interrupt function for Timer A. 
TimerIntRegister( TIMER0_BASE, TIMER_A,
Timer0A_Handler);

TimerIntEnable( TIMER0_BASE, TIMER_TIMA_TIMEOUT);
//Set interrupt priority 
IntPrioritySet( INT_TIMER0A, 0);
//Enable interrupts 
IntEnable( INT_TIMER0A);
IntMasterEnable();
//Enable the timer 
TimerEnable( TIMER0_BASE, TIMER_A);

}

int main(void)
{
HardWave_Init();//Serial interface, system clock initialization 
HC_SR04_Init();
Timer_Init();
printf("Initialization complete \n");

while(1)//The main loop 
{

printf("%d\n",sonar_mm() );
delay_ms(10);

}
}

The ultrasonic readout using the above method always returns 0. Could you help check is there anything need to be modified? Thanks.

Best Regards,

Cherry

  • Hi Cherry,

      If you put a breakpoint in the Timer ISR, does the processor stop there?

      Also in your line 29, you clear the time variable to zero GPIOB4 is low. If time is zero then you are calculating the distance to zero, isn't? So check your pin input status on a scope. 

    A heads up that I'm out of office until 8/3.