STM32F407红外避障控制舵机
1.首先是红外避障传感器模块部分
红外避障传感器模块的infrared.h文件
#ifndef __INFRARED_
#define __INFRARED_
#include "sys.h"
#define REDOUT GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)
void Infrared_Init(void);
#endif
红外避障传感器模块的infrared.c文件
#include "infrared.h"
void Infrared_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15; //选择你要设置的IO口
// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//设置浮空输入
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN; //普通输入
//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //不设置上下拉,浮空
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置传输速率
GPIO_Init(GPIOB,&GPIO_InitStructure); /* 初始化GPIO */
}
因为部分STM32F407不设置上下拉,是默认浮空的。若是GPIO_InitTypeDef 和 RCC_AHB1PeriphClockCmd报错显示#20未定义的需要加入stm32f4xx_gpio.h和stm32f4xx_gpio.c若是RCC的就要加入stm32f4xx_rcc.c和stm32f4xx_rcc.h文件
2.舵机模块部分
看图下舵机型号
舵机有黑红橙三格导线,棕色导线是GND,红色是VCC,橙色是信号线。
舵机steering.h的文件
#ifndef __STEERING_
#define __STEERING_
#include "sys.h"
void TIM13_PWM_Init(u32 arr,u32 psc);
//void TIM11_PWM_Init(u32 arr,u32 psc);
#endif
舵机steering.c的文件
若TIM_TimeBaseInitTypeDef 或者TIM_OCInitTypeDef有报错#20未定义的话需要加入stm32f4xx_tim.h和stm32f4xx_tim.c文件
#include "steering.h"
void TIM13_PWM_Init(u32 arr,u32 psc)
{
//此部分可手动修改IO口设置
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13,ENABLE); //TIM13时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟
GPIO_PinAFConfig(GPIOF,GPIO_PinSource8,GPIO_AF_TIM13); //GPIOF9复用为定时器13
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOF8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF8
TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM13,&TIM_TimeBaseStructure);//初始化定时器13
//初始化TIM13 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性低
TIM_OC1Init(TIM13, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1
TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable); //使能TIM14在CCR1上的预装载寄存器
TIM_ARRPreloadConfig(TIM13,ENABLE);//ARPE使能
TIM_Cmd(TIM13, ENABLE); //使能TIM13
}
//void TIM11_PWM_Init(u32 arr,u32 psc)
//{
//此部分可手动修改IO口设置
// GPIO_InitTypeDef GPIO_InitStructure;
// TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// TIM_OCInitTypeDef TIM_OCInitStructure;
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM11,ENABLE); //TIM11时钟使能
// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟
// GPIO_PinAFConfig(GPIOF,GPIO_PinSource7,GPIO_AF_TIM11); //GPIOF9复用为定时器11
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //GPIOF7
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
// GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF7
// TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
// TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
// TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
// TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
// TIM_TimeBaseInit(TIM11,&TIM_TimeBaseStructure);//初始化定时器11
//初始化TIM11 Channel1 PWM模式
// TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
// TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
// TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性低
// TIM_OC1Init(TIM11, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1
// TIM_OC1PreloadConfig(TIM11, TIM_OCPreload_Enable); //使能TIM11在CCR1上的预装载寄存器
// TIM_ARRPreloadConfig(TIM11,ENABLE);//ARPE使能
// TIM_Cmd(TIM11, ENABLE); //使能TIM11
//}
以TIM11为例子,若向用其他TIM可以根据STM32F407手册查看可以用TIM进行修改也可以增加多个,对比例子可以看出基本修改一下想要用的TIM就可以,还要注意引脚问题。
主程序
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "infrared.h"
#include "steering.h"
int main(void)
{
delay_init(168);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //初始化串口波特率为115200
Infrared_Init();//红外避障模块初始化
TIM13_PWM_Init(200-1,8400-1); //
while(1)
{
if(REDOUT==0)
{
TIM_SetCompare1(TIM13,15); //90度
delay_ms(1000);
}
else
{
TIM_SetCompare1(TIM13,5);//0度
delay_ms(1000);
}
printf("变量 = %d g\r\n",REDOUT);//打印红外避障输入口的高低电平。
delay_ms(1000);
}
}