系列文章:
1,单片机实战入门1--电机驱动简介及常用操作(本文)
2,......
3,......
一,毕设需求
作为电子信息相关的专业呢,大家想必都很苦恼,对于毕设做什么。
电机呢作为工作也好,毕设也好,项目也好,都是非常使用的东西和内容
二、电机驱动
1、电机驱动简介
直流电机大概分为以下,有刷和无刷,同时又分有没有减速。
有刷和无刷的字面意思是有无碳刷;有刷电机电机工作时需要线 圈和换向器旋转,磁钢和碳刷不转,线圈电流方向的交替变化是随电机转动的换相器和电刷来完 成的。无刷直流电动机是采用半导体开关器件来实现电子换向的,使用电子开关器件代替传统的 接触式换向器和电刷。
普通的直流电机当空载时,电机的转速由电压决定 ; 直流减速电机的转速由齿轮组和电压决定;齿轮组的作用是,提供较低的转速,较大的力矩; 同时不同的减速比会提供不同的转速和力矩。这样就大大提高了减速电机的使用率。喜欢车的小伙伴应该有所了解。
每一种电机需要各自特定的驱动电路(桥式电路),也就是驱动器
像我们常用的直流电机驱动 ,TB6612,L298N,私服有特定的驱动,步进电机也是。
电机驱动有很多种模块
2、常用电机操作
常用的电机就说普通的直流电机,舵机作为转向
1、舵机
舵机操作比较简单,在初始化相关引脚和定时器之后,直接调用相关API即可
//舵机角度控制
void SERVO_Angle_Control(unsigned int Compare1)
{
TIM_SetCompare1(TIM4,Compare1);//设置通道1为可变的pwm
}
void SERVO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; //配置为复用推挽输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
TIM_TimeStructure.TIM_Period=1000; //1000 自动重装载寄存器的值,周期为50 000Hz/1000=50Hz,即输出PWM波形的频率为20ms。
TIM_TimeStructure.TIM_Prescaler=1440-1;; // 1400 时钟预分频系数为3600,72 000 000Hz/1400=50000Hz =50KHZ。
TIM_TimeStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM4,&TIM_TimeStructure);
TIM_ARRPreloadConfig(TIM4,ENABLE);
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=0; //占空比大小
TIM_OC1Init(TIM4,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIM_Cmd(TIM4,ENABLE);
TIM_CtrlPWMOutputs(TIM4,ENABLE);
}
2,普通直流电机
需要定时器初始化四个通道,一个轮子两个通道,一个作为0,另一个设置占空比
static void GENERAL_TIM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 输出比较通道1 和2 GPIO 初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //Prescaler= (uint16_t)(72M/240000000)-1;
//通道3和4
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //Prescaler= (uint16_t)(72M/240000000)-1;
}
/* ---------------- PWM信号 周期和占空比的计算--------------- */
// ARR :自动重装载寄存器的值
// CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
// PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
// 占空比P=CCR/(ARR+1)
void GENERAL_TIM_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GENERAL_TIM_APBxClock_FUN(RCC_APB1Periph_TIM3 | RCC_APB2Periph_AFIO,ENABLE); // 配置周期,这里配置为100K
TIM_TimeBaseStructure.TIM_Period=99; // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
TIM_TimeBaseStructure.TIM_Prescaler= 719; // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
TIM_TimeBaseStructure.TIM_ClockDivision=0; // 时钟分频因子 ,配置死区时间时需要用到
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; // 计数器计数模式,设置为向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter=0; // 重复计数器的值,没用到不用管
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 初始化定时器
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 配置为PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出通道电平极性配置
//通道1
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
//通道2
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
//通道3
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
//通道4
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(GENERAL_TIM, ENABLE);
}
如图就说一个case中有两个设置占空比的就是设置电机的,还要看通道的个数
输入定时器使能的两队通道,分别连接到黄色两个,输出A,B分别接到小车的电机。
一般连接方法,121V给这块板子供电,这个板子的5V分出去给开发板供电,记得共地,这个板子和开发板的地线要连接起来,不然无法形成回路,动不了
调节占空比控制速度,调整接线方向,控制郑凡界,同时,两个占空比也可以反过来,倒转。