最近在做超声波模块控制舵机转向。利用这个的在我们生活中也比较常见,最常见的莫过于避障小车了 现在看一下源码。
#include "HCSR04.h"
#include "sys.h"
#include "delay.h"
/*
* 函数名:UltrasonicWave_Configuration
* 描述 :超声波模块的初始化
* 输入 :无
* 输出 :无
*/
void UltrasonicWave_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PC8接TRIG
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设为推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化外设GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PC9接ECH0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设为输入
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/*
* 函数名:UltrasonicWave_StartMeasure
* 描述 :开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
* 输入 :无
* 输出 :无
*/
void UltrasonicWave_StartMeasure(void)
{
Trig = 1;
delay_us(15); //延时20US
Trig = 0;
}
#include "pwm.h"
#include "delay.h"
#include "sys.h"
//舵机模块的PWM初始化
void PWM_Init()
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器
TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx
/* 开启时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/* 配置GPIO的模式和IO口 */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;// PA1
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
//TIM3定时器初始化
TIM_TimeBaseInitStructure.TIM_Period = 1999; //PWM 频率=72000/(1999+1)=36Khz//设置自动重装载寄存器周期的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 719;//设置用来作为TIMx时钟频率预分频值
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM2, & TIM_TimeBaseInitStructure);
// GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);//改变指定管脚的映射 //pC6
//PWM初始化 //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OC1Init(TIM2,&TIM_OCInitStructure);
//注意此处初始化时TIM_OC1Init而不是TIM_OCInit,否则会出错。因为固件库的版本不一样。
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器
TIM_Cmd(TIM2,ENABLE);//使能或者失能TIMx外设
}
void pwm(void)
{
delay_ms(500);
TIM_SetCompare1(TIM2, 50);//0度
delay_ms(1000);
TIM_SetCompare1(TIM2, 100);//45度
delay_ms(1000);
TIM_SetCompare1(TIM2,150);//90度
delay_ms(1000);
TIM_SetCompare1(TIM2, 200);//135度
delay_ms(1000);
TIM_SetCompare1(TIM2, 250);//180度
delay_ms(100);
}
- #include "delay.h"
- #include "sys.h"
- #include "usart.h"
- #include "timer.h"
- #include "HCSR04.h"
- #include "led.h"
- #include "pwm.h"
- unsigned long S=0; //定义超声数据
- extern unsigned long Clock_time;
- extern u8 TIM3CH1_CAPTURE_STA; //输入捕获状态
- extern u16 TIM3CH1_CAPTURE_VAL; //输入捕获值
-
- void ceju()
- {
- Trig=1;
- delay_us(20);
- Trig=0; //启动信号
- S=0; //清零距离数据
- Clock_time=0;
- TIM_Cmd(TIM3, DISABLE); //关定时器,清零计时变量
- while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)); //等待检测到高电平
- Clock_time=0;
- TIM_Cmd(TIM3, ENABLE); //开定时器
- while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1&&Clock_time<47058); //只要是高,一直算时间,如果时间计数超过 47058,所说有问题,直接跳过,47058不一定精确,是一个大概值,
- S=((Clock_time*2)*340/10000)/2; //时间变量是2us加一,乘以速度,因为时间是us,换成秒是除以1000000,保留两位小数,所以除以 10000,然后除以二得到单方面距离
- TIM_Cmd(TIM3, DISABLE); //关定时器
- Clock_time=0; //清零数据
- GPIO_ResetBits(GPIOD,GPIO_Pin_2);//led 灯
-
- GPIO_ResetBits(GPIOA,GPIO_Pin_8);//led 灯
- }
-
- int main(void)
- {
- delay_init(); //延时函数初始化
- PWM_Init();
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- LED_Init(); //LED端口初始化
- UltrasonicWave_Configuration(); //初始化超声IO
- TIM3_Cap_Init(1,72-1); //以1Mhz的频率计数,第一个选项,最小只能是1
- ceju();
- while(1)
- {
- ceju();
- if(S<20)
- {
- GPIO_ResetBits(GPIOA,GPIO_Pin_8);
- GPIO_SetBits(GPIOD,GPIO_Pin_2);
- // pwm();
- delay_ms(500);
- pwm();
- ceju();
- }
- else
- {
- GPIO_ResetBits(GPIOD,GPIO_Pin_2);
- GPIO_SetBits(GPIOA,GPIO_Pin_8);
- //pwm();
- delay_ms(500);
- ceju();
- }
- }
- }
复制代码
代码下载:
超声波控制舵机.7z
(189.64 KB, 下载次数: 25)
|