一、步进电机
1、驱动芯片A4988
驱动步进电机运用A4988,
详细内容:https://wenku.baidu.com/view/218c9d0da517866fb84ae45c3b3567ec112ddc4b.html
其接线图如下:
2、方向控制
A4988->direction = 0/1
电机转动的方向即为A4988上的direction控制。
3、速度控制
电机的速度不能直接加到最高,需要缓冲速度,如下图两种速度方法:
注意:为使步进电机在运行中不出现失步现象,一般要求其最高运行频率应小于(或等于)步进响应频率。
详细速度内容http://www.elecfans.com/emb/danpianji/2009091791659.html
二、直流电机
1、驱动芯片TB6612FNG
详细:http://tech.hqew.com/circuit_1476430
TB6612FNG可以驱动两个电机
下面分别是控制两个电机的IO口
STBY口接单片机的IO口清零电机全部停止,
置1通过AIN1 AIN2,BIN1,BIN2 来控制正反转
VM 接12V以内电源
VCC 接5V电源
GND 接电源负极
驱动1路
PWMA 接单片机的PWM口
真值表:
AIN1 0 0 1
AIN2 0 1 0
停止 正传 反转
A01
A02 接电机1的两个脚
驱动2路
PWMB 接单片机的PWM口
真值表:
BIN1 0 0 1
BIN2 0 1 0
停止 正传 反转
2、速度改变
通过改变PWM的占空比实现调速 。
三、舵机
舵机无驱动,方向通过改变PWM的占空比来实现,没有速度变化
舵机角度与PWM占空比关系图:
代码模块
PWM的配置
#include "pwm.h"
#include "stm32f4xx.h"
void pwm_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
TIM_TimeBaseInitStruct.TIM_Period=arr;
TIM_TimeBaseInitStruct.TIM_Prescaler=psc;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitStruct);
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC1Init(TIM14,&TIM_OCInitStruct);
TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM14,ENABLE);
TIM_Cmd(TIM14, ENABLE);
/********** F2和F3的端口初始化 **********/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOF, &GPIO_InitStructure);
/********** 初始化PF5 **********/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_SetBits(GPIOF,GPIO_Pin_5);
}
主函数部分:
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "pwm.h"
#include "key.h"
//#include "led.h"
int main()
{
u16 key,cout;
delay_init(168);
KEY_Init();
/******************************* 舵机部分 ***********************************
*********** 0.5ms(0),1ms(45),1.5ms(90),2ms(135),2.5ms(180) *************/
/*
pwm_Init(199,8399); //50hz,20ms
while(1)
{
key=KEY_Scan(0);
if(key)
{
switch(key)
{
case KEY1_PRES:
TIM_SetCompare1(TIM14,180); //1.5ms,12点方向
break;
case KEY2_PRES:
TIM_SetCompare1(TIM14,185);
break;
}
}
}
*/
/******************************* 直流电机 *******************************/
pwm_Init(419,2-1);//50khz
cout = 100;
while(1)
{
GPIO_SetBits(GPIOF,GPIO_Pin_3); //正转
GPIO_ResetBits(GPIOF,GPIO_Pin_2);
TIM_SetCompare1(TIM14,50);
key=KEY_Scan(0);
if(key == 3)
{
cout+=100;
if(cout == 400)
{
cout=100;
}
}
if(key == 2)
{
while(1)
{
key=KEY_Scan(0);
if(key == 3)
{
cout+=50;
if(cout == 420)
{
cout=50;
}
}
delay_ms(100);
GPIO_ResetBits(GPIOF,GPIO_Pin_2); //stop
GPIO_ResetBits(GPIOF,GPIO_Pin_3);
delay_ms(100);
GPIO_ResetBits(GPIOF,GPIO_Pin_3); //反转
GPIO_SetBits(GPIOF,GPIO_Pin_2);
TIM_SetCompare1(TIM14,cout);
if(key == 2)
break;
}
}
}
/******************************* 步进电机 *******************************/
/*
GPIO_ResetBits(GPIOF,GPIO_Pin_2);
// 1400-300hz 840-500hz(pefect) 600-700hz
cout = 1000;
while(1)
{
delay_ms(50);
GPIO_SetBits(GPIOF,GPIO_Pin_3);//˳ʱÕë
key=KEY_Scan(0);
if(key == 3)
{
cout-=400;
if(cout == 200)
{
cout =1000;
}
}
pwm_Init(199,cout);//hz=420k/cout+1
TIM_SetCompare1(TIM14,100);
if(key == 2)
{
while(1)
{
key=KEY_Scan(0);
if(key == 3)
{
cout-=400;
if(cout == 200)
{
cout =1000;
}
}
delay_ms(50);
GPIO_ResetBits(GPIOF,GPIO_Pin_3);//ÄæʱÕë
TIM_SetCompare1(TIM14,100);
if(key == 2)
break;
}
}
}
*/
}