之前在学习stm32的时候接触到一个简单的项目--智能垃圾桶。通过研究它的原理发现其实是超声波模块HCSR04发射超声波接触到物体会返回并启动舵机的旋转。
单片机源程序如下:
- 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);
-
- }
复制代码 这个是pwm舵机函数(sg90)- #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;
- }
复制代码 这个是超声波模块函数
剩下的代码大家可以根据情况自行下载
注:我在整个超声波控制舵机代码运行时发现一个问题,就是在执行到舵机部分的时候就一直卡在那里,从硬件上看就是led0不会跳回到led1,但是有时可以有时又不可以,这个问题我也不知道怎么回事,遇到同样问题的大家可以一起解决。
全部程序51hei下载地址:
超声波控制舵机.7z
(187.93 KB, 下载次数: 39)
|