完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
本项目使用CubeMX初始化项目,使用HAL库编写程序,使用STM32F407的TIM2,TIM3控制四个直流电机,从而实现小车八个方向的运动.
概念 直流电机 输出或输入为直流电能的旋转电机,称为直流电机,它是能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。 PWM PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%. STM32 STM32,从字面上来理解, ST 是意法半导体, M 是 Microelectronics 的缩写, 32 表示32 位,合起来理解, STM32 就是指 ST 公司开发的 32 位微控制器。自带了各种常用通信接口,比如 USART、 I2C、 SPI 等,可接非常多的传感器,可以控制很多的设备。现实生活中,我们接触到的很多电器产品都有 STM32 的身影,比如智能手环,微型四轴飞行器,平衡车、移动 POST 机,智能电饭锅,3D 打印机等等。 STM32 有很多系列,可以满足市场的各种需求,从内核上分有 Cortex-M0、 M3、 M4和 M7 这几种,每个内核又大概分为主流、高性能和低功耗。本项目使用STM32F407作为主控。 STM32的通用定时器PWM STM32 的定时器功能十分强大,有TIME1和TIME8等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器。 STM32 的通用定时器 TIMx (TIM2、TIM3、TIM4 和 TIM5) 功能包括: 1) 16位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。 2) 16位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。 3)4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: A.输入捕获 B.输出比较 C.PWM 生成(边缘或中间对齐模式) D.单脉冲模式输出 4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。 5)如下事件发生时产生中断/DMA: A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) C.输入捕获 D.输出比较 E.支持针对定位的增量(正交)编码器和霍尔传感器电路 F.触发输入作为外部时钟或者按周期的电流管理 本项目使用STM32F407的TIMER2和TIMER3定时器输出PWM实现对直流电机的控制. 系统结构 程序实现 CubeMX初始化项目 打开STM32CubeMX,配置相关引脚和定时器TIM2,TIM3 下面设置TIM2为例 1.设置四路输出通道为PWM,设置为内部时钟源 2.设置定时器预分频系数和周期,设置四个PWM输出通道.因为STM32F407的TIM2和TIM3都是挂载在APB1总线上,该总线的时钟频率为84MHz,故这里设置这两个定时器的预分频系数为83+1,然后设置时钟周期为999+1.可得到1kHz的PWM脉冲. 3.配置引脚,给引脚设置标签 然后自行配置RCC,时钟,相关项目设置,最后点击生成项目 #ifndef _MOTOR_H #define _MOTOR_H #include #include "delay.h" #include "main.h" //定义定时器寄存器,便于程序的拓展和修改 #define LF1_CCR TIM2->CCR1 #define LF2_CCR TIM2->CCR2 #define RF1_CCR TIM2->CCR3 #define RF2_CCR TIM2->CCR4 #define LR1_CCR TIM3->CCR1 #define LR2_CCR TIM3->CCR2 #define RR1_CCR TIM3->CCR3 #define RR2_CCR TIM3->CCR4 //定义复用引脚功能 #define LF_GPIO_AF GPIO_AF1_TIM2 #define RF_GPIO_AF GPIO_AF1_TIM2 #define LR_GPIO_AF GPIO_AF2_TIM3 #define RR_GPIO_AF GPIO_AF2_TIM3 //定义定时器 #define LF_TIM htim2 #define RF_TIM htim2 #define LR_TIM htim3 #define RR_TIM htim3 //定义定时器通道 #define LF1_TIM_CHANNEL TIM_CHANNEL_1 #define LF2_TIM_CHANNEL TIM_CHANNEL_2 #define RF1_TIM_CHANNEL TIM_CHANNEL_3 #define RF2_TIM_CHANNEL TIM_CHANNEL_4 #define LR1_TIM_CHANNEL TIM_CHANNEL_1 #define LR2_TIM_CHANNEL TIM_CHANNEL_2 #define RR1_TIM_CHANNEL TIM_CHANNEL_3 #define RR2_TIM_CHANNEL TIM_CHANNEL_4 //定义引脚初始化操作 #define MOTOR_LF_F initGPIO_AF(MOTOR_LF1_GPIO_Port,MOTOR_LF1_Pin,LF_GPIO_AF);initGPIO_OUTPUT(MOTOR_LF2_GPIO_Port,MOTOR_LF2_Pin); #define MOTOR_LF_B initGPIO_OUTPUT(MOTOR_LF1_GPIO_Port,MOTOR_LF1_Pin);initGPIO_AF(MOTOR_LF2_GPIO_Port,MOTOR_LF2_Pin,LF_GPIO_AF); #define MOTOR_LF_S initGPIO_OUTPUT(MOTOR_LF1_GPIO_Port,MOTOR_LF1_Pin);initGPIO_OUTPUT(MOTOR_LF2_GPIO_Port,MOTOR_LF2_Pin); #define MOTOR_RF_F initGPIO_AF(MOTOR_RF1_GPIO_Port,MOTOR_RF1_Pin,RF_GPIO_AF);initGPIO_OUTPUT(MOTOR_RF2_GPIO_Port,MOTOR_RF2_Pin); #define MOTOR_RF_B initGPIO_OUTPUT(MOTOR_RF1_GPIO_Port,MOTOR_RF1_Pin);initGPIO_AF(MOTOR_RF2_GPIO_Port,MOTOR_RF2_Pin,RF_GPIO_AF); #define MOTOR_RF_S initGPIO_OUTPUT(MOTOR_RF1_GPIO_Port,MOTOR_RF1_Pin);initGPIO_OUTPUT(MOTOR_RF2_GPIO_Port,MOTOR_RF2_Pin); #define MOTOR_LR_F initGPIO_AF(MOTOR_LR1_GPIO_Port,MOTOR_LR1_Pin,LR_GPIO_AF);initGPIO_OUTPUT(MOTOR_LR2_GPIO_Port,MOTOR_LR2_Pin); #define MOTOR_LR_B initGPIO_OUTPUT(MOTOR_LR1_GPIO_Port,MOTOR_LR1_Pin);initGPIO_AF(MOTOR_LR2_GPIO_Port,MOTOR_LR2_Pin,LR_GPIO_AF); #define MOTOR_LR_S initGPIO_OUTPUT(MOTOR_LR1_GPIO_Port,MOTOR_LR1_Pin);initGPIO_OUTPUT(MOTOR_LR2_GPIO_Port,MOTOR_LR2_Pin); #define MOTOR_RR_F initGPIO_AF(MOTOR_RR1_GPIO_Port,MOTOR_RR1_Pin,RR_GPIO_AF);initGPIO_OUTPUT(MOTOR_RR2_GPIO_Port,MOTOR_RR2_Pin); #define MOTOR_RR_B initGPIO_OUTPUT(MOTOR_RR1_GPIO_Port,MOTOR_RR1_Pin);initGPIO_AF(MOTOR_RR2_GPIO_Port,MOTOR_RR2_Pin,RR_GPIO_AF); #define MOTOR_RR_S initGPIO_OUTPUT(MOTOR_RR1_GPIO_Port,MOTOR_RR1_Pin);initGPIO_OUTPUT(MOTOR_RR2_GPIO_Port,MOTOR_RR2_Pin); //从main.c中引入定时器实例 extern TIM_HandleTypeDef htim2; extern TIM_HandleTypeDef htim3; /*********函数定义****************/ //停止所有PWM通道的输出 void Motor_TIM_PWM_Stop(void); //设置小车前进方向为向前 void CarTurnForward(void); //设置小车前进方向为向后 void CarTurnBackward(void); //设置小车前进方向为向左 void CarTurnLeft(void); //设置小车前进方向为向右 void CarTurnRight(void); //设置小车前进方向为向左前 void CarTurnLF(void); //设置小车前进方向为向右前 void CarTurnRF(void); //设置小车前进方向为向左后 void CarTurnLR(void); //设置小车前进方向为向右后 void CarTurnRR(void); //小车停止 void CarStop(void); //通过设置比较值设置小车的速度 void CarForward(u32 valLeftFront,u32 valRightFront,u32 valLeftRear,u32 valRightRear); void CarBack(u32 valLeftFront,u32 valRightFront,u32 valLeftRear,u32 valRightRear); void CarLeft(u32 valLeftFront,u32 valRightFront,u32 valLeftRear,u32 valRightRear); void CarRight(u32 valLeftFront,u32 valRightFront,u32 valLeftRear,u32 valRightRear); void CarLF(u32 valRF,u32 valLR); void CarRF(u32 valLF,u32 valRR); void CarLR(u32 valLF,u32 valRR); void CarRR(u32 valRF,u32 valLR); //引脚初始化 void initGPIO_OUTPUT(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); void initGPIO_AF(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin,uint8_t GPIO_AF); //测试函数 void CarTest(void); #endif |
|
|
|
只有小组成员才能发言,加入小组>>
2431 浏览 0 评论
9078 浏览 4 评论
36741 浏览 19 评论
5020 浏览 0 评论
24701 浏览 34 评论
1512浏览 2评论
1730浏览 1评论
2169浏览 1评论
1538浏览 0评论
509浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 10:25 , Processed in 1.491971 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号