关注分享主机优惠活动
国内外VPS云服务器

项目3:利用PWM波和GPIO控制电机(PWM波控制原理)

总结:在高频下,电机运行连续、平稳、噪音低,但较高的频率也会增加设备的功耗。 较低的频率可以降低功耗并提高调速线性度,但频率太低。 电机的旋转连续性可能会降低。 通常该装置可以稳定地控制电机。

1. 驱动芯片介绍

使用TB6612规律:
TB6612是双驱动器,也就是说它可以驱动两个电机。 下面是控制两个电机的IO口。 STBY端口连接到单片机的IO端口。 清除电机以停止一切并在 AIN1 上设置 1/0。 AIN2、BIN1、BIN2用于正转和反转控制。
2. 真值表

3. 电路图

4. PWM 说明

(1) 设备 输出驱动/制动状态切换时电机转速与PWM占空比能够保持良好的线性关系,运行控制效果优于驱动/制动状态切换时。 /停止状态下,表1中的IN1/IN2通常不使用L/L控制组合。

(2) 当fPWM较高时,电机连续平稳运行,噪声较低,但随着频率的增加,设备的功耗也随之增加。 当fPWM较低时,有利于降低功耗和提高调节能力。 虽然提供了速度线性,但频率太低会导致电机的旋转一致性较差。 通常,如果fPWM>1 kHz,则该器件可以稳定地控制电机。

5. 现在我们来谈谈代码。 !

main.c

#include "motor.h"#include "stdio.h"#include "lay.h"#include "stm32f10x.h" u8 UART3_data ,UART1_data; u8 UART3_rcv[20],UART3_rcv_count; u8 UART1_rcv[50],UART1_rcv_count,Uart1_finish;int main(void){//int left_speed=5,right_speed=5;int Speed=5;lay_init();GPIO_init () ;TIME4_init(7199,10);car_go(速度);delay_s(2);car_left(0,2);delay_s(1);car_move(速度);delay_s(2 );car_stop();}

motor.c

#include "motor.h"//电机GPIO引脚初始化函数/* **************** ** ********** ************************************** ***** ******** ***********/void GPIO_init(void){//引脚结构体定义 GPIO_InitTypeDef GPIO_InitStruct;//打开时钟使用 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //关闭PB4引脚的特殊功能 GPIO_PinRemapConfig(GPIO_R)emap_SWJ_JTAGDisable,ENABLE);//设置PB4/5/8/9引脚驱动电机的参数 Speed=GPIO_Speed_50MHz; //初始化PB4/5/8/9引脚 GPIO_Init(GPIOB, &GPIO_InitStruct);//配置PB4/5/8/9引脚的参数PB6/7 引脚用于生成 PWM 波 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_7;GPIO_InitStruct。    GPIO_Speed = GPIO_Speed_50MHz; //初始化PB6/7的引脚 GPIO_Init(GPIOB, &GPIO_InitStruct); //初始化所有引脚置零 GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);GPIO_ResetBits( GPIOB,GPIO_Pin_4) ;_ResetBits(GPIOB,GPIO_Pin_5);}/**************************************** ****** ****** * ********************************** ****************** **** ** **********************///TIME4初始化函数/ ****************************************************** ************************************************/void TIME4_init(int presc,int arr){ / / 定义定时器的结构体 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; //定义定时器 PWM 输出通道的结构体 TIM_OCInitTypeDef TIM_OCInitStruct; //打开 TIME4 时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //设置 TIME4 结构体的参数 TIM_TimeBaseInit Struct M_ClockDivision = TIM_CKD_DIV1 ; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_TimeBaseInitStruct.TIM_Prescaler = presc; TIM_TimeBaseInitStruct.TIM_Period =arr; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct); //T 设置 IME4 通道结构体参数_OCMode = TIM_OCInitStruct .TIM_OCPolarity = TIM_OCPolarity_High; .TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse =0; //初始化TIME4通道1 TIM_OC1Init(TIM4, &TIM_OCInitStruct);4 通道 1 预载寄存器 TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //初始化 TIME4 通道 2 TIM_OC2Init(TIM4, &TIM_OCInitStruct); //使能 TIME4 通道 2 预载寄存器 TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能 TIME4 TIM_Cmd( TIM4, EN能) ;}/**************************************** ** ****** * ****************************************** *** ****** * *********///前进功能/************************ **** ********* ********************************************************** ** *********************/void car_go(intspeed){motor_left_speed(speed);Motor_right_speed(speed);GPIO_SetBits(GPIOB , GPIO_Pin_9); , GPIO_Pin_8);GPIO_SetBits(GPIOB, GPIO_Pin_4); GPIO_ResetBits(GPIOB,GPIO_Pin_5);}/******************************** ****** ****** ****************************************** ****** **** **************************///小车左转功能/**** ********** ******************************************************************** * ******************************************************/ void car_left(int motor_left_speed, int 电机右速度 ){ 电机左速度 (Motor_right_speed(motor_right_speed);GPIO_ResetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_8);GPIO_SetBits(GPIOB, GPIO_Pin_4); ,GPIO_Pin_5);}/ ********** ********************************** ****************************************************** ********************** ********** ************ *///车右转动功能/******************** ********** ************** **** ************************************************** ** ********************/void car_right( int 电机左速度, int 电机右速度 ){ 电机左速度 (电机左速度);GPIO_ResetBits( GPIOB,GPIO_Pin_8);GPIO_SetBits(GPIOB,GPIO_Pin_9);;GPIO_ResetBits(GPIOB,GPIO_Pin_4);GPIO_ResetBits(GPIOB,GPIO_Pin_5);}/******************************** * ** ****** ********************************************** * *** **** **************************///停车功能/********* * ****** ** ********************************************** ****** ****** * ********************************** ****** *****/void car_stop (void){ GPIO_ResetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_8);GPIO_ResetBits(GPIOB,GPIO_Pin_4); }/* ****** ****** ************************************** ***************************************************** ****** ******/// 汽车倒车功能/******************************** ** ****************** ********** ****************** ** ****************** ********** ****************/void car_back( int Speed ​​){ 电机左速度(speed); Motor_right_speed(speed);GPIO_SetBits(GPIOB, G);PIO_Pin_8);GPIO_ResetBits(GPIOB,GPIO_Pin_9);GPIO_SetBits(GPIOB,GPIO_Pin_5);GPIO_ResetBits(GPIOB,GPIO_Pin_4);}/************************ ****************************************************** ****************************************************** *************/// 1秒延时功能/**** ************ ************* ****************************************************** ***************************** *********** ********/空白的延迟_s(int s){for(;s>0;s--){delay_ms(1000);}}/************ ********** ****************************************************** ** ************************** ****************** **/

motor.h

#ifndef __MOTOR_H__#define __MOTOR_H__//需要调用的库#include "stm32f10x_rcc.h" #include "stm32f10x_gpio .h"# include " stm32f10x_tim.h"#include "lay.h"//宏定义#define PERIOD 10 //周期为10ms,频率为1Khz#define motor_left_speed(left_speed) {TIM_SetCompare1(TIM4, left_speed);} //设置 PWMA 占空比的函数宏定义 #define motor_right_speed(right_speed) {TIM_SetCompare2(TIM4, right_speed);} //设置 PWMB 占空比的函数宏定义 //自定义函数 void GPIO_init (void);void TIME4_init(int presc,int arr);void car_go(int Speed);void car_left(int motor_left_speed,int motor_right_speed);void car_right(int motor_left_speed,int motor_right_speed);void car_stop(void);void car_back( int Speed);void Late_s(int s);#endif

终于! ! ! 我会把代码详细注释一下,希望大家以后能看懂。

未经允许不得转载:主机频道 » 项目3:利用PWM波和GPIO控制电机(PWM波控制原理)

评论 抢沙发

评论前必须登录!