main.c
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "motor.h"
#include "remote.h"
int main(void)
{
u8 key;
u8 t=0;
u8 i=1;
u8 *str=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
TIM3_PWM_Init(450,7199); //PWM输出初始化
TIM2_PWM_Init(450,7199); //PWM输出初始化
TIM5_PWM_Init(450,7199); //PWM输出初始化
Remote_Init(); //红外接收初始化
while(1)
{
key = 0;
key=Remote_Scan();
if(key)
{
str = 0;
switch(key)
{
/*
case 0:str="ERROR";break;
case 162:str="POWER";break;
case 98:str="UP";break; //前进键
case 2:str="PLAY";break;
case 226:str="ALIENTEK";break;
case 194:str="RIGHT";break; //右
case 34:str="LEFT";break; //左
case 224:str="VOL-";break;
case 168:str="DOWN";break; //后退键
case 144:str="VOL+";break;
case 104:str="1";break;
case 152:str="2";break;
case 176:str="3";break;
case 48:str="4";break;
case 24:str="5";break;
case 122:str="6";break;
case 16:str="7";break;
case 56:str="8";break;
case 90:str="9";break;
case 66:str="0";break;
case 82:str="DELETE";break;
*/
case 98:
motor_forward();
delay_ms(50);
break;
case 168:
motor_down();
delay_ms(50);
break; //后退键
case 194:
motor_right();
delay_ms(50);
break;
case 34:
motor_left();
delay_ms(50);
break;
case 104:
PA4_HIGH;
PA8_HIGH;
delay_ms(50);
PA4_LOW;
PA8_LOW;
break;
case 152:
PD11_HIGH;
PD12_HIGH;
delay_ms(50);
PD11_LOW;
PD12_LOW;
break;
case 48:
motor_space();
break;
case 24:
motor_space_right();//右
break;
case 16:
PD13_HIGH;
PD14_HIGH;
delay_ms(50);
PD13_LOW;
PD14_LOW;
break;
case 56:
PE0_HIGH;
PE1_HIGH;
delay_ms(50);
PE0_LOW;
PE1_LOW;
break;
case 176:
PE2_HIGH;
PE3_LOW;
delay_ms(50);
PE2_LOW;
PE3_LOW;
break;
case 122:
PE3_HIGH;
PE2_LOW;
delay_ms(50);
PE2_LOW;
PE3_LOW;
break;
case 66:
PE6_HIGH;
delay_ms(50);
PE6_LOW;
break;
}
motor_stop();
}
else
delay_ms(10);
//P6_HIGH;
//P5_LOW;
//P3_HIGH;
//P2_LOW; //IO测试
//PB10_HIGH;
//PB11_LOW;
}
}
motor.c
#include "motor.h"
#include "usart.h"
#include "delay.h"
//TIM3 PWM部分初始化
//PWM输出初始化
//arr:自动重装载值
//psc 时钟预分频系数
void TIM3_PWM_Init(u16 arr,u16 psc)//tim3,ch2,IOA7
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE, ENABLE); //使能GPIO外设时钟
//初始化IOPA11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_11);
//初始化IOPA12
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_12);
//初始化IOPA4,举高电机
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
//初始化IOPA8,举高电机
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
//初始化IOPD11,举高电机
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_ResetBits(GPIOD,GPIO_Pin_11);
//初始化IOPD12,举高电机
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_ResetBits(GPIOD,GPIO_Pin_12);
//初始化IOPD13,伸出电机
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_ResetBits(GPIOD,GPIO_Pin_13);
//初始化IOPD14,伸出电机
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_ResetBits(GPIOD,GPIO_Pin_14);
//初始化IOPE0,伸出电机
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_ResetBits(GPIOE,GPIO_Pin_0);
//初始化IOPE1,伸出电机
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_ResetBits(GPIOE,GPIO_Pin_1);
//初始化IOPE2,抬升电机
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_ResetBits(GPIOE,GPIO_Pin_2);
//初始化IOPE3,抬升电机
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_ResetBits(GPIOE,GPIO_Pin_3);
//初始化IOPE6,锯冰电机
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_ResetBits(GPIOE,GPIO_Pin_6);
//初始化IOPA7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
//初始化TIM3 Channel 2
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择PWM模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low ; //输出比较极性地
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能定时器3通道2预装载寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIM3
}
void TIM2_PWM_Init(u16 arr, u16 psc)//tim2,ch2,IOA1
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个引脚初始化的结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue; //定义一个定时中断的结构体
TIM_OCInitTypeDef TIM_OCInitTypeStrue; //定义一个PWM输出的结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟,在STM32中使用IO口前都要 使能对应时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能通用定时器2时钟,A1引脚对应TIM2CHN2
//初始化IOPA5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
//初始化IOPA6
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
//初始化IOPA1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseInitStrue.TIM_Period=arr; //计数模式为向上计数时,定时器从0开始计数,计数超过到arr时触发定时中断服务函数
TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //预分频系数,决定每一个计数的时长
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; //计数模式:向上计数
TIM_TimeBaseInitStrue.TIM_ClockDivision=0; //一般不使用,默认TIM_CKD_DIV1
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStrue); //根据TIM_TimeBaseInitStrue的参数初始化定时器TIM2
TIM_OCInitTypeStrue.TIM_OCMode=TIM_OCMode_PWM1; //PWM模式1,当定时器计数小于TIM_Pulse时,定时器对应IO输出有效电平
TIM_OCInitTypeStrue.TIM_OCPolarity=TIM_OCNPolarity_High; //输出有效电平为高电平
TIM_OCInitTypeStrue.TIM_OutputState=TIM_OutputState_Enable; //使能PWM输出
TIM_OCInitTypeStrue.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OC2Init(TIM2, &TIM_OCInitTypeStrue); //根TIM_OCInitTypeStrue参数初始化定时器2通道3
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable); //CH2预装载使能
TIM_ARRPreloadConfig(TIM2, ENABLE); //CH2预装载使能
TIM_Cmd(TIM2, ENABLE); //使能定时器TIM2
}
void TIM5_PWM_Init(u16 arr, u16 psc)//tim5,ch1,IOA0
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个引脚初始化的结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue; //定义一个定时中断的结构体
TIM_OCInitTypeDef TIM_OCInitTypeStrue; //定义一个PWM输出的结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟,在STM32中使用IO口前都要 使能对应时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能通用定时器4时钟
//初始化IOPB10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_10); //PB.5 输出高
//初始化IOPB11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_11); //PB.5 输出高
//初始化IOPA0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseInitStrue.TIM_Period=arr; //计数模式为向上计数时,定时器从0开始计数,计数超过到arr时触发定时中断服务函数
TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //预分频系数,决定每一个计数的时长
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; //计数模式:向上计数
TIM_TimeBaseInitStrue.TIM_ClockDivision=0; //一般不使用,默认TIM_CKD_DIV1
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseInitStrue); //根据TIM_TimeBaseInitStrue的参数初始化定时器TIM4
TIM_OCInitTypeStrue.TIM_OCMode=TIM_OCMode_PWM1; //PWM模式1,当定时器计数小于TIM_Pulse时,定时器对应IO输出有效电平
TIM_OCInitTypeStrue.TIM_OCPolarity=TIM_OCNPolarity_High; //输出有效电平为高电平
TIM_OCInitTypeStrue.TIM_OutputState=TIM_OutputState_Enable; //使能PWM输出
TIM_OCInitTypeStrue.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OC1Init(TIM5, &TIM_OCInitTypeStrue); //根TIM_OCInitTypeStrue参数初始化定时器2通道3
TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Disable); //CH1预装载使能
TIM_ARRPreloadConfig(TIM5, ENABLE); //CH1预装载使能
TIM_Cmd(TIM5, ENABLE); //使能定时器TIM5
}
void motor_forward(void)
{
TIM_SetCompare2(TIM3,300);//foward
PA11_HIGH;
PA12_LOW;
TIM_SetCompare2(TIM2,300);//foward
PA6_HIGH;
PA5_LOW;
}
void motor_stop(void)
{
PA11_LOW;
PA12_LOW;
PA6_LOW;
PA5_LOW;
}
void motor_down(void)
{
TIM_SetCompare2(TIM3,300);//foward
PA11_LOW;
PA12_HIGH;
TIM_SetCompare2(TIM2,300);//foward
PA6_LOW;
PA5_HIGH;
}
void motor_left(void)
{
TIM_SetCompare2(TIM3,300);//foward
PA11_LOW;
PA12_HIGH;
TIM_SetCompare2(TIM2,300);//foward
PA6_HIGH;
PA5_LOW;
}
void motor_right(void)//左
{
TIM_SetCompare2(TIM3,300);//foward
PA11_HIGH;
PA12_LOW;
TIM_SetCompare2(TIM2,300);//foward
PA6_LOW;
PA5_HIGH;
}
void motor_space(void)//左
{
TIM_SetCompare1(TIM5,300);//foward
PB10_HIGH;
PB11_LOW;
delay_ms(50);
PB10_LOW;
PB11_LOW;
}
void motor_space_right(void)//左
{
TIM_SetCompare1(TIM5,300);//foward
PB11_HIGH;
PB10_LOW;
delay_ms(50);
PB10_LOW;
PB11_LOW;
}
motor.h标签:Pin,开发板,STM32,TIM,InitStructure,LOW,GPIO,除冰,define From: https://blog.51cto.com/u_15906483/5928748
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
#define PA6 GPIO_Pin_6
#define PA5 GPIO_Pin_5
//#define MORTOR_PROT GPIOA
#define PA6_LOW GPIO_ResetBits(GPIOA,PA6)
#define PA6_HIGH GPIO_SetBits(GPIOA,PA6)
#define PA5_LOW GPIO_ResetBits(GPIOA,PA5)
#define PA5_HIGH GPIO_SetBits(GPIOA,PA5)
#define PA11 GPIO_Pin_11
#define PA12 GPIO_Pin_12
#define PA11_LOW GPIO_ResetBits(GPIOA,PA11)
#define PA11_HIGH GPIO_SetBits(GPIOA,PA11)
#define PA12_LOW GPIO_ResetBits(GPIOA,PA12)
#define PA12_HIGH GPIO_SetBits(GPIOA,PA12)
#define PA4 GPIO_Pin_4
#define PA4_LOW GPIO_ResetBits(GPIOA,PA4)
#define PA4_HIGH GPIO_SetBits(GPIOA,PA4)
#define PA8 GPIO_Pin_8
#define PA8_LOW GPIO_ResetBits(GPIOA,PA8)
#define PA8_HIGH GPIO_SetBits(GPIOA,PA8)
#define PD11 GPIO_Pin_11
#define PD11_LOW GPIO_ResetBits(GPIOD,PD11)
#define PD11_HIGH GPIO_SetBits(GPIOD,PD11)
#define PD12 GPIO_Pin_12
#define PD12_LOW GPIO_ResetBits(GPIOD,PD12)
#define PD12_HIGH GPIO_SetBits(GPIOD,PD12)
#define PB10 GPIO_Pin_10
#define PB10_LOW GPIO_ResetBits(GPIOB,PB10)
#define PB10_HIGH GPIO_SetBits(GPIOB,PB10)
#define PB11 GPIO_Pin_11
#define PB11_LOW GPIO_ResetBits(GPIOB,PB11)
#define PB11_HIGH GPIO_SetBits(GPIOB,PB11)
#define PD11 GPIO_Pin_11
#define PD11_LOW GPIO_ResetBits(GPIOD,PD11)
#define PD11_HIGH GPIO_SetBits(GPIOD,PD11)
#define PD12 GPIO_Pin_12
#define PD12_LOW GPIO_ResetBits(GPIOD,PD12)
#define PD12_HIGH GPIO_SetBits(GPIOD,PD12)
#define PD13 GPIO_Pin_13
#define PD13_LOW GPIO_ResetBits(GPIOD,PD13)
#define PD13_HIGH GPIO_SetBits(GPIOD,PD13)
#define PD14 GPIO_Pin_14
#define PD14_LOW GPIO_ResetBits(GPIOD,PD14)
#define PD14_HIGH GPIO_SetBits(GPIOD,PD14)
#define PE0 GPIO_Pin_0
#define PE0_LOW GPIO_ResetBits(GPIOE,PE0)
#define PE0_HIGH GPIO_SetBits(GPIOE,PE0)
#define PE1 GPIO_Pin_1
#define PE1_LOW GPIO_ResetBits(GPIOE,PE1)
#define PE1_HIGH GPIO_SetBits(GPIOE,PE1)
#define PE2 GPIO_Pin_2
#define PE2_LOW GPIO_ResetBits(GPIOE,PE2)
#define PE2_HIGH GPIO_SetBits(GPIOE,PE2)
#define PE3 GPIO_Pin_3
#define PE3_LOW GPIO_ResetBits(GPIOE,PE3)
#define PE3_HIGH GPIO_SetBits(GPIOE,PE3)
#define PE6 GPIO_Pin_6
#define PE6_LOW GPIO_ResetBits(GPIOE,PE6)
#define PE6_HIGH GPIO_SetBits(GPIOE,PE6)
void TIM3_PWM_Init(u16 arr,u16 psc);
void TIM2_PWM_Init(u16 arr,u16 psc);
void TIM5_PWM_Init(u16 arr,u16 psc);
void motor_forward(void);
void motor_stop(void);
void motor_down(void);
void motor_right(void);
void motor_left(void);
void motor_space(void);
void motor_space_right(void);
#endif