|

楼主 |
发表于 2020-2-9 13:55:11
|
显示全部楼层
由于单片机的项目文件压缩后仍有667M,无法上传到论坛中,这里先介绍部分模块的代码,若有感兴趣的坛友可通过短消息联系。
这里先介绍超声波测距模块的代码,整个智能小车共使用了三个超声波测距探头,为了节约资源,我没有使用传统的驱动方法,而是采用了定时器对全局变量进行计数,周期为10微秒。程序在对超声波探头发出Trig信号后,先等待Echo信号,一旦收到Echo信号便将定时器的全局变量清零,待Echo信号结束后立即通过全局变量的值换算出距离,这种算法可以用一个定时器为多个超声波探头进行驱动,下面是驱动代码:
/******************************************************************************************
* 函数名称: SR04_ranging(void)
* 功能说明: 进行超声波测距,返回测得的结果(厘米)
* 输 入: 无
* 输 出: 传感器16位的距离值(CM),前后检测传感器数据存放在SR[x][id]数组中
******************************************************************************************/
uint16_t SR04_ranging(void)
{
uint16_t sum;
uint8_t i;
sum = 0;
for(i=0; i<5; i++){
//发送启动信号(Trig=1)
HAL_GPIO_WritePin(SR2_Trig_GPIO_Port,SR2_Trig_Pin,GPIO_PIN_SET);
Delay(15); //延时约40us(LCD5110函数)
LCD_write_ASCII(0,3,1,(uint8_t *)"Trig Comple! ");
HAL_GPIO_WritePin(SR2_Trig_GPIO_Port,SR2_Trig_Pin,GPIO_PIN_RESET);
LCD_write_ASCII(0,3,1,(uint8_t *)"Wait Echo Read");
//等待回波信号(Echo=0时循环等待,Echo=1时开始计时)
while(HAL_GPIO_ReadPin(SR2_Echo_GPIO_Port,SR2_Echo_Pin)==0);
LCD_write_ASCII(0,3,1,(uint8_t *)"Wait Echo! ");
SR_10us = 0;
while(HAL_GPIO_ReadPin(SR2_Echo_GPIO_Port,SR2_Echo_Pin)==1);
//累计五次测量结果
sum += SR_10us;
HAL_Delay(1);
}
SR[0][SRId] = sum*17/500 + 1; //返回数值的单位为厘米
sum = 0;
for(i=0; i<5; i++){
//发送启动信号(Trig=1)
HAL_GPIO_WritePin(SR3_Trig_GPIO_Port,SR3_Trig_Pin,GPIO_PIN_SET);
Delay(15); //延时约40us(LCD5110函数)
// LCD_write_ASCII(0,3,1,(uint8_t *)"Trig Comple! ");
HAL_GPIO_WritePin(SR3_Trig_GPIO_Port,SR3_Trig_Pin,GPIO_PIN_RESET);
// LCD_write_ASCII(0,3,1,(uint8_t *)"Wait Echo Read");
//等待回波信号(Echo=0时循环等待,Echo=1时开始计时)
while(HAL_GPIO_ReadPin(SR3_Echo_GPIO_Port,SR3_Echo_Pin)==0);
// LCD_write_ASCII(0,3,1,(uint8_t *)"Wait Echo! ");
SR_10us = 0;
while(HAL_GPIO_ReadPin(SR3_Echo_GPIO_Port,SR3_Echo_Pin)==1);
//累计五次测量结果
sum += SR_10us;
HAL_Delay(1);
}
SR[1][SRId] = sum*17/500 + 1; //返回数值的单位为厘米
sum = 0;
for(i=0; i<5; i++){
//发送启动信号(Trig=1)
HAL_GPIO_WritePin(SR1_Trig_GPIO_Port,SR1_Trig_Pin,GPIO_PIN_SET);
Delay(15); //延时约40us(LCD5110函数)
HAL_GPIO_WritePin(SR1_Trig_GPIO_Port,SR1_Trig_Pin,GPIO_PIN_RESET);
//等待回波信号(Echo=0时循环等待,Echo=1时开始计时)
while(HAL_GPIO_ReadPin(SR1_Echo_GPIO_Port,SR1_Echo_Pin)==0);
SR_10us = 0;
while(HAL_GPIO_ReadPin(SR1_Echo_GPIO_Port,SR1_Echo_Pin)==1);
//累计五次测量结果
sum += SR_10us;
HAL_Delay(1);
}
return sum*17/500 + 1; //返回数值的单位为厘米(10us*0.17/5)
}
|
|