一、PWM 输出控制电机

PWM 输出控制电机

电机系列

一、PWM 输出控制电机

1 、相关 IO 介绍

电机控制芯片为A4950;控制方式需要两路pwm,可以 同时做速度和方向的控制;

2 、编写 PWM 输出库函数

在工程中加入电机控制文件:
《一、PWM 输出控制电机》
《一、PWM 输出控制电机》

PWM.h

#ifndef __MOTOR_H
#define __MOTOR_H
#include <sys.h> 

/************************************************************************** Author:chance A4950 四路电机编码器IO定义 **************************************************************************/

#define PWMA2 TIM8->CCR1 
#define PWMA1 TIM1->CCR1 

#define PWMB2 TIM8->CCR2 
#define PWMB1 TIM1->CCR2 

#define PWMC2 TIM1->CCR3
#define PWMC1 TIM8->CCR3

#define PWMD1 TIM8->CCR4
#define PWMD2 TIM1->CCR4 

void MiniBalance_PWM_Init(u16 arr,u16 psc);

#endif

PWM.c

#include "motor.h"

/************************************************************************** Author:chance A4950 四路电机编码器IO定义 **************************************************************************/

void MiniBalance_PWM_Init(u16 arr,u16 psc)
{ 		 		
	//1) 定义相关结构体:
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	//2) 使能相关时钟:
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);// 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);  //使能GPIO外设时钟使能
	
	//3) 初始化 GPIO:
   //设置该引脚为复用输出功能,输出TIM1 CH1 CH2 CH3 CH4的PWM脉冲波形
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; //TIM1 CH1 CH2 CH3 CH4
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

   //设置该引脚为复用输出功能,输出TIM1 CH1 CH2 CH3 CH4的PWM脉冲波形
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //TIM81 CH1 CH2 CH3 CH4
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);

	//4) 设置并初始化定时器 TIM1,TIM8:
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 不分频
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

	//5) 设置并初始化 PWM:
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_Pulse = 0;                            //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //输出极性:TIM输出比较极性高
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	TIM_OC2Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	TIM_OC3Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	TIM_OC4Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	TIM_OC1Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	TIM_OC2Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	TIM_OC3Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	TIM_OC4Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	
	//6) 预装载设置:
  TIM_CtrlPWMOutputs(TIM1,ENABLE);	//MOE 主输出使能 
	TIM_CtrlPWMOutputs(TIM8,ENABLE);	//MOE 主输出使能 
	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能 
	TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH4预装载使能 
	TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能 
	TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH4预装载使能 
  TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH1预装载使能 
	TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH4预装载使能 
	TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH1预装载使能 
	TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH4预装载使能 
	TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
	TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIMx在ARR上的预装载寄存器
	
	//7) 使能定时器:
	TIM_Cmd(TIM1, ENABLE);  //使能TIM1
	TIM_Cmd(TIM8, ENABLE);  //使能TIM8
 
} 

3、控制函数

编写控制函数:
赋值给PWM寄存器
《一、PWM 输出控制电机》
部分代码:

control.h

#ifndef __CONTROL_H
#define __CONTROL_H
#include "sys.h"

/************************************************************************** Author:chance **************************************************************************/

void Set_Pwm(int motor_a,int motor_b,int motor_c,int motor_d);


#endif

control.c

#include "control.h" 
#include "motor.h" 

/************************************************************************** 函数功能:赋值给PWM寄存器 入口参数:PWM 返回 值:无 **************************************************************************/
void Set_Pwm(int motor_a,int motor_b,int motor_c,int motor_d)
{ 
	  	if(motor_a>0)			PWMA1=7200,PWMA2=7200-motor_a;
			else 	            PWMA2=7200,PWMA1=7200+motor_a;
		
		  if(motor_b>0)			PWMB1=7200,PWMB2=7200-motor_b;
			else 	            PWMB2=7200,PWMB1=7200+motor_b;
	
	    if(motor_c>0)			PWMC1=7200,PWMC2=7200-motor_c;
			else 	            PWMC2=7200,PWMC1=7200+motor_c;
		
	    if(motor_d>0)			PWMD1=7200,PWMD2=7200-motor_d;
			else 	            PWMD2=7200,PWMD1=7200+motor_d;
}

4、main函数;

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "motor.h"
#include "control.h"

 int main(void)
 { 	
	  delay_init();	    	            //=====延时函数初始化 
	  MY_NVIC_PriorityGroupConfig(2);	//=====设置中断分组
	  LED_Init();                     //=====初始化与 LED 连接的硬件接口
	  MiniBalance_PWM_Init(7199,0);
	  while(1)
	 { 
		Led_Flash(30);
		Set_Pwm(4000,4000,1000,1000);		
		delay_ms(15);
	}
 }
 
 

源码:
源码见

    原文作者:Chance Z
    原文地址: https://blog.csdn.net/yechen1/article/details/111386150
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞