基于STM32的步进电机、直流电机和舵机的PWM驱动(实用型有代码)

一、步进电机
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;				
					}						
				}

       	
 		}
						
	*/
	}

评论 3 您还未登录,请先 登录 后发表或查看评论
相关推荐

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Mr.los

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值