DYP-ME007V1

Продовжую вивчати STM32. Цього разу вирішив підключити Ультразвуковий дальномір (сонар). Модель DYP-ME007v1.

Параметри:

  • Відстань вимірювання від 20 мм до 500 мм
  • Частота 40 кГц
  • Час вимірювання 100 мсек.
  • Точність 1 см.
  • Робоча температура від – 10 до +60 °С
  • Робоча напруга і логічні рівні 5 Вольт.

Робочими виходами є дві ноги Triger і Echo. До мікроконтролера їх потрібно під’єднувати через резисторний ділитель, або конвертор рівнів, з 5V на 3,3V. Triger – GPIO_Pin_6, Echo – GPIO_Pin_7, порт GPIOC. UART TX – GPIO_Pin_9, UART RX – GPIO_Pin_10, порт GPIOA.
Данні передаються в термінал у вигляді відстані до об’єкта в сантиметрах.

Код добре закоментований, думаю пояснень давати до нього непотрібно.

 

#include "stm32f10x.h"
#include 
 
void USART_Configuration(void);
int8_t usart1_getc(void);
void usart1_puts(unsigned char * s);
void usart1_putc(unsigned char c);
void GPIO_Configuration(void);
void delay_ms(__IO unsigned long ms);
void delay_us(__IO unsigned long us);
uint32_t Read_Distance(void);
void SONAR_Functions(void);
 
/* Global variable */
 
float distance=0;
char str[20]="";
uint8_t i;
int main(void)
{
SystemInit();
USART_Configuration();
GPIO_Configuration();
 
 
while(1)																	 
{	
SONAR_Functions();
delay_ms(300);
}
}
 
void SONAR_Functions(void)
{
distance = (float)Read_Distance();
distance = (distance*340)/(2.00*10000.00);		  //Convert to cm by divide 10000
 
 
 
if((distance > 0)&&(distance <= 400.00))
{                 
GPIO_SetBits(GPIOC, GPIO_Pin_9);
sprintf(str,"%0.2f\n",distance);  
usart1_puts(str);
GPIO_ResetBits(GPIOC, GPIO_Pin_9); 
} 
if(distance >= 400.00)
{
usart1_puts("Distance is to mutch\n");
} 
}
 
void GPIO_Configuration(void)
{
/* GPIO variable structure */
GPIO_InitTypeDef GPIO_InitStructure;
 
/* Enable PCLK2 for APB2 for GPIOA and GPIOC */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
 
/* Ultrasonic Triger Pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
 
/* Ultrasonic ECHO Pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
 
/* Blue led and Green led on Discovery kit */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
 
}
 
void USART_Configuration(void)
{ 
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure; 
 
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
/*
*  USART1_TX -> PA9 , USART1_RX ->	PA10
*/				
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;	         
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);		   
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;	        
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
GPIO_Init(GPIOA, &GPIO_InitStructure);
 
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure); 
 
USART_Cmd(USART1, ENABLE);
 
}
 
uint32_t Read_Distance(void)
{
uint8_t read_status=0;
uint32_t disTime=0;
GPIO_SetBits(GPIOC,GPIO_Pin_6);
delay_us(10);
GPIO_ResetBits(GPIOC,GPIO_Pin_6);
 
while(read_status == 0)
{
while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7) == SET)
{
disTime++;
read_status = 1;
}
 
}
return disTime;
 
}
 
int8_t usart1_getc(void)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == RESET);
return (USART_ReceiveData(USART1));
}
 
 
void usart1_puts(unsigned char * s)
{
while(*s)
usart1_putc(*s++);
}
 
 
void usart1_putc(unsigned char c)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
USART_SendData(USART1,(int)c);
}
 
void delay_ms(__IO unsigned long ms)
{
volatile unsigned long i,j;
for (i = 0; i < ms; i++ );
for (j = 0; j < 3442; j++ );
}
 
 
void delay_us(__IO unsigned long us)
{
u32 i;
while(us--)
{
i=2;
while(i--);
}
}

Код не мій, знайдений десь в інтернеті.
Проект в IAR: Sonar

Comments:

Написати відповідь

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

вимагається