第三篇-V1.5 TB6612电机pwm控制STM32智能小车

发布者:幸福的家园最新更新时间:2024-09-13 来源: elecfans关键字:pwm控制  STM32  智能小车 手机看文章 扫描二维码
随时随地手机看文章

功能介绍放开头, 使用便捷无需愁。

这是全网最详细、性价比最高的STM32实战项目入门教程,通过合理的硬件设计和详细的视频笔记介绍,硬件使用STM32F103主控资料多方便学习,通过3万字笔记、12多个小时视频、20多章节代码手把手教会你如何开发和调试。让你更快掌握嵌入式系统开发


V1.5.0-STM32智能小车

V1.5.0:库函数开发。功能:循迹、避障、跟随、遥控、电池电压显示等。

视频合集链接推荐观看

[https://www.bilibili.com/video/BV1SY411L7rJ/?spm_id_from=333.337.search-card.all.click]

**V3.3.0-STM32智能小车 **

V3:HAL库开发、功能:PID速度控制、PID循迹、PID跟随、遥控、避障、PID角度控制、视觉控制、电磁循迹、RTOS等功能。

视频合集链接推荐观看

[https://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click]

系统软件设计

点亮小灯

查看原理图

查阅原理图,小灯接在PC13上下面驱动PC13
在这里插入图片描述

编写驱动

在这里插入图片描述

思考题:如果同时驱动PC13与PC14,应该如何编写?(答案:应该增加下图代码)
在这里插入图片描述

LED_Init()函数的代码


void LED_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PB,PC端口时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //PC13

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz

GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化

GPIOC.13

GPIO_SetBits(GPIOC,GPIO_Pin_13); //PC.13输出高

}

LED.h 部分宏定义


#define LED PCout(13)// PC13



测试

编译下载(如果没有运行,需要按复位 运行)

电机驱动

由TB6612介绍得,通过控制AO和AO2高低电平可以控制AIN1和AIN2输出。

GPIO 高低电平控制AIN和BIN

  1. 查阅原理图AIN1、AIN2、BIN1、BIN2依次接在单片机的PB13、PB12、PB1、PB0
    在这里插入图片描述

原理同GPIO输出高低电平见第二节

TB6612 GPIO驱动函数代码

//驱动6612 的AIN1 AIN2 BIN1 BIN2

// AIN1 PB13

// AIN2 PB12

// BIN1 PB1

// BIN2 PB0

void TB6612_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟

GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13

|GPIO_Pin_12|GPIO_Pin_0|GPIO_Pin_1; //PB0 OB1 PB12 PB13端口配置

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz

GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化

GPIO_SetBits(GPIOB,GPIO_Pin_13 |GPIO_Pin_12|GPIO_Pin_0|GPIO_Pin_1);

//PB0 OB1 PB12 PB1 输出高

}

相关宏定义


#define AIN1 PBout(13)// PB13

#define AIN2 PBout(12)// PB12

#define BIN1 PBout(1)// PB1

#define BIN2 PBout(0)// PB0


PWM控制PWMA和PWMB

将 PWM输出实验 的 timer 文件移植到我们前面点灯的工程中,更改驱动文件

  1. 查看原理图 PWMA 和PWMB依次连接PA11和PA8

  2. 查看 参考手册 关于定时器复用功能重映射的介绍(中文参考手册第119页)
    在这里插入图片描述

初始化外设

配置对应引脚功能

初始化TIM1

初始化TIM1 相应通道的 PWM模式

使能

注意输出使能 高级定时器必须使用:TIM_CtrlPWMOutputs(TIM_TypeDef TIMx, *

FunctionalState NewState);

//TIM1 PWM部分初始化

//PWM输出初始化

//arr:自动重装值

//psc:时钟预分频数

void TIM1_PWM_Init(u16 arr,u16 psc)

{

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

//使能对应定时器

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能定时器1时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,

ENABLE); //使能GPIO外设和AFIO复用功能模块时钟

//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE); //Timer3部分重映射

TIM3_CH2- >PB5

//配置对应引脚功能

//设置该引脚为复用输出功能,输出TIM1 CH1 和CH4

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11; //TIM_CH1 TIM_CH4

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO

//初始化TIM1

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的时间基数单位

//初始化TIM1 Channel1 PWM模式

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽

度调制模式2

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输

出比较极性高

TIM_OC1Init(TIM1, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3

OC2

TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装

载寄存器

//初始化TIM1 Channel4 PWM模式

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽

度调制模式2

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输

出比较极性高

TIM_OC4Init(TIM1, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3

OC2

TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装

载寄存器

TIM_Cmd(TIM1, ENABLE); //使能TIM1

TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能,高级定时器必须开启这

}

调用初始化函数、改变占空比。


TIM1_PWM_Init(1999,359);

//TIM1挂在APB2为72M ,故计算 72 000 000 /(359+1)/(1999+1) = 100 Hz,

//故设置了频率为100 Hz、自动重装载值 1999

TIM_SetCompare1(TIM1,100); //设置 TIM1 通道1 捕获/比较寄存器值 为 1000 可以

计算出占空比

//PA8 PWMB

TIM_SetCompare4(TIM1,1900); //设置

//PA11 PWMA


通过软件仿真

逻辑分析仪观察波形输出、显示PWM波形
设置好仿真环境
在这里插入图片描述
打开逻辑分析仪

在这里插入图片描述
添加要观察的引脚
在这里插入图片描述
跳到设置对应程序位置,打开仿真
在这里插入图片描述
打开实时更新选项
在这里插入图片描述
调节观察分析仪
在这里插入图片描述
产生的如图方波就是一种PWM波
在这里插入图片描述
在这里插入图片描述

那么在程序哪里设置的这些参数那

时钟预分频数 决定了PWM 频率和周期


TIM1_PWM_Init(1999,359);

//TIM1挂在APB2为72M ,故计算 72 000 000 /(359+1)/(1999+1) = 100 Hz,


那么谁调节占空比那?
在这里插入图片描述

  1. 非常好理解、定时器的计数器向上计数就是越来越大。

  2. PWM 模式我们可以看手册
    在这里插入图片描述
    3.这里的TIM_OCPolarity_High 就是把有效电平设置为高
    举个栗子:如果我们设置上面的示例参数,工作过程应该是怎么的呐?
    在这里插入图片描述


电机控制通过AIN1、AIN2、BIN1、BIN2控制电机正反转,通过PWMA、PWMB控制电机转速


AIN1 = 1;

AIN2 = 0;

BIN1 = 1;

BIN2 = 0;

TIM_SetCompare4(TIM1,1500); //设置 A

TIM_SetCompare1(TIM1,1500); //设置B


让小车跑一跑吧

小车电机线正确接法
在这里插入图片描述
错误接法
在这里插入图片描述


小车直行


void Forward(void)

{

AIN1 = 1;

AIN2 = 0;

BIN1 = 1;

BIN2 = 0;

TIM_SetCompare4(TIM1,1500); //设置 A

TIM_SetCompare1(TIM1,1500); //设置B

}

小车后退


void Backward(void)

{

AIN1 = 0;

AIN2 = 1;

BIN1 = 0;

BIN2 = 1;

TIM_SetCompare4(TIM1,1500); //设置 A

TIM_SetCompare1(TIM1,1500); //设置B

}

小车左转


void Leftward(void)

{

AIN1 = 0;

AIN2 = 1;

BIN1 = 1;

BIN2 = 0;

TIM_SetCompare4(TIM1,1500); //设置 A

TIM_SetCompare1(TIM1,1500); //设置B

}

小车右转


void Rightward(void)

{

AIN1 = 1;

AIN2 = 0;

BIN1 = 0;

BIN2 = 1;

TIM_SetCompare4(TIM1,1500); //设置 A

TIM_SetCompare1(TIM1,1500); //设置B

}


关键字:pwm控制  STM32  智能小车 引用地址:第三篇-V1.5 TB6612电机pwm控制STM32智能小车

上一篇:STM32F103的贴片机控制系统的设计
下一篇:都是32位MCU,ESP32、GD32、STM32有什么区别

推荐阅读最新更新时间:2024-11-12 12:09

菜鸟初识STM32固件库文件夹
ARM、TI、ST等公司在嵌入式学习者眼中的区别 ARM 是一个做芯片标准的公司,它负责的是芯片内核的架构设计,而 TI,ST 这样的公司,他们并不做标准,他们是芯片公司,他们是根据 ARM 公司提供的芯片内核标准设计自己的芯片。所以,任何一个做 芯片 (例如Cortex-M3),他们的内核结构都是一样的,不同的是他们的存储器容量,片上外设,IO 以及其他模块的区别。所以你会发现,不同公司设计的 芯片(例如Cortex-M3)他们的端口数量,串口数量,控制方法这些都是有区别的,这些资源他们可以根据自己的需求理念来设计。同一家公司设计的多种内核芯片(例如Cortex-M3)的片上外设也会有很大的区别.通过ARM公司的《Cortex-
[单片机]
解析STM32的库函数
意法半导体在推出STM32微控制器之初,也同时提供了一套完整细致的固件开发包,里面包含了在STM32开发过程中所涉及到的所有底层操作。通过在程序开发中引入这样的固件开发包,可以使开发人员从复杂冗余的底层寄存器操作中解放出来,将精力专注应用程序的开发上,这便是ST推出这样一个开发包的初衷。 但这对于许多从51/AVR这类单片机的开发转到STM32平台的开发人员来说,势必有一个不适应的过程。因为程序开发不再是从寄存器层次起始,而要首先去熟悉STM32所提供的固件库。那是否一定要使用固件库呢?当然不是。但STM32微控制器的寄存器规模可不是常见的8位单片机可以比拟,若自己细细琢磨各个寄存器的意义,必然会消耗相当的时间,并且对于程序后续的
[单片机]
STM32 Flash操作(擦写)过程中器件复位导致数据丢失问题
1.问题描述 产品在运行过程中需要保存一些断电不丢失的数据,为此将数据保存在STM32内部的flash中。但是测试人员在测试的过程中,修改了数据参数,直接断电重启机器,并没有等待flash的操作时间,导致原有的数据丢失。 2. 原理分析 本产品硬件平台是基于STM32F429,采用HAL库开发。在操作内部flash这部分中,查看数据手册得知: 对于操作128KB的扇区擦写32位数据需要的时间,典型值是1S。最大值是2S。才能保证操作完成。 而在参考手册中提到:在Flash操作期间发生器件复位,则无法保证flash中的内容, 为此,我特地在擦写过程中,断电,然后看flash中的数据是什么,经过
[单片机]
<font color='red'>STM32</font> Flash操作(擦写)过程中器件复位导致数据丢失问题
stm32设置唯一MAC地址
stm32参考手册中指出,在地址为0x1FFFF7E8处,有一个唯一的身份标识寄存器。 可以直接访问该值。 printf( rnChip ID: %x, %x, %xrn , *(vu32*)(0x1ffff7e8), *(vu32*)(0x1ffff7e8+4), *(vu32*)(0x1ffff7e8+8)); Chip ID: 5d8ff39, 36364e4e, 43137403 虽然这个96bit的ID是唯一的,但是MAC地址却只有48bit,因为量产有不同批次,而且采购的很随机的话这个ID号也是不唯一的,比较靠谱一点的还是自己在指定FLASH位置定义一个变量,这样程序就写死去读这个地方的值,而这个地
[单片机]
<font color='red'>stm32</font>设置唯一MAC地址
浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)
引子 STM32的硬件I2C很多人都对它望而却步。因为很多电工都说,STM32 硬件 I2C有BUG、不稳定、死机等等……最后都使用GPIO模拟I2C。 的确,模拟I2C好用。但是在我看来在一个72M的Cortex-M3的MCU上这样做非常不妥。一般来说I2C是一种慢速总线,就算工作在400kHz的快速模式上,I2C传送每个字节仍需要至少23us——还没有计算地址、起始信号和结束信号的发送。如果使用GPIO模拟的I2C,这23us的CPU时间都在空转中浪费了,而这23us已经可以做不少的事情了,所以在STM32上I2C还是使用硬件为佳——虽然它多多少少有点缺陷。 这篇文章不是给完全没有接触过STM32 硬件I2C的新手看的,看这篇
[单片机]
浅谈 <font color='red'>STM32</font> 硬件I2C的使用 (中断方式 无DMA 无最高优先级)
STM32之程序如何防止堆栈溢出
近日为某个项目写了个草稿程序,即非正式程序,后来发现老是进入hardfaulthandler,原来是堆栈溢出,后仔细查看发现函数调用纵深太深,最多的时候可保持7个函数在堆栈中调用。 因此有心得如下: 一、函数调用不要纵深太深,即以下模式: main() { fun1(); } fun1() { fun2(); } fun2() { fun3(); } fun3() { fun4(); } fun4() { fun5(); } fun5() { fun6(); } fun6() { fun7(); } 这样子main函数要调用fun1函数完成某个功能,则要一直调到fun7为止,才能完成。这样导致堆栈中
[单片机]
STM32之中断与事件一个使用GPIO作为外部中断的示例
1.GPIO 的正确设置 GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOD clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); /* Configure PD.03, PC.04, as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPIO_InitStru
[单片机]
一种STM32微控制器处理电机控制的设计和实现
变频器是利用电力半导体器件的通断作用将工频电源变换为另一频率的电能控制装置,能实现对交流异步电机的软起动、变频调速、提高运转精度、改变功率因数、过流/过压/过载保护等功能。变频器集成了高压大功率晶体管技术和电子控制技术,得到广泛应用。变频器的作用是改变交流电机供电的频率和幅值,因而改变其运动磁场的周期,达到平滑控制电动机转速的目的。变频器的出现,使得复杂的调速控制简单化,用变频器+交流鼠笼式感应电动机组合替代了大部分原先只能用直流电机完成的工作,缩小了体积,降低了维修率,使传动技术发展到新阶段。本文将探讨基于ARM的标准微控制器如何在一个被DSP和FPGA长期垄断的市场上打破复杂的控制模式,我们将以意法半导体的基于Cortex-M
[单片机]
一种<font color='red'>STM32</font>微控制器处理<font color='red'>电机</font>控制的设计和实现
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved