首页 > 其他分享 >STM32学习笔记_PWM驱动舵机和直流电机(4)

STM32学习笔记_PWM驱动舵机和直流电机(4)

时间:2023-12-17 21:02:39浏览次数:32  
标签:include 舵机 Init STM32 OLED GPIO PWM Speed

STM32驱动舵机:

舵机接线图:将PWM脚接在开发板PA1处;

STM32学习笔记_PWM驱动舵机和直流电机(4)_舵机

新建舵机模块:

STM32学习笔记_PWM驱动舵机和直流电机(4)_直流电机_02


分析舵机的PWM信号:在一个周期20ms的脉冲信号上,高电平占空比为0.5ms-2.5ms分别对应着0°-180°。

STM32学习笔记_PWM驱动舵机和直流电机(4)_直流电机_03

计算PWM的参数信息:

PSC为72,ARR为20K,这样就得到一个频率周期为50Hz的信号。

其中20KHz等于20ms,将CCR设置为500即=0.5ms的占空比。

将CCR设置为2500既可以得到一个2.5ms的占空比PWM信号。

STM32学习笔记_PWM驱动舵机和直流电机(4)_STM32学习笔记_04

编写舵机模块代码:

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

//函    数:舵机初始化
void Servo_Init(void)
{
	PWM_Init();
}

//函    数:舵机设置角度
void Servo_SetAngle(uint8_t Angle)
{	
	PWM_SetCompare2((Angle / 180) * 2000 + 500);
}


编写主函数代码,通过按键的形式,毎按下一次按键舵机角度Angle自增30:

#include "stm32f10x.h"    //添加头文件
#include "Delay.h"
#include "LED.h"
#include "KEY.h"
#include "Timer.h"
#include "OLED.h"
#include "PWM.h"
#include "Servo.h"

int main(void)
{
	/*模块初始化*/
	OLED_Init();	//OLED初始化
	Servo_Init();
	KEY_Init();
	
	OLED_ShowString(1, 1, "Angle:");		//OLED显示字符
	
	while(1)
	{	
		uint8_t Angle;					//定义角度变量
		uint8_t KeyNum;					//定义用于接收键码的变量
		KeyNum = Key_GetNum();			//获取按键键码
		if(KeyNum == 1)					//按键1按下
		{
			Angle+=30;					//角度变量自增30
		}
		if(Angle > 180)
		{
			Angle = 0;					//角度变量归零
		}
		Servo_SetAngle(Angle);			//设置舵机的角度为角度变量
		OLED_ShowNum(2, 1, Angle, 3);	//OLED显示角度变量
	}
}


STM32驱动直流电机:

直流电机接线图,电机使用了TB6612驱动板的驱动方式,其中AIN1/AIN2是电机的控制脚分别接开发板的PA4/PA5,用来控制电机的正反转和刹车,PWM信号接在开发板的PA2引脚;

STM32学习笔记_PWM驱动舵机和直流电机(4)_直流电机_05

新建直流电机模块:

STM32学习笔记_PWM驱动舵机和直流电机(4)_STM32学习笔记_06


编写电机模块代码,首先初始化PWM和GPIO引脚,然后编写设置电机速度的函数:

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

//函    数:直流电机初始化
void Motor_Init(void)
{
	//PWM初始化
	PWM_Init();
	
	/*开启直流电机控制脚GPIO的时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

//函    数:直流电机设置速度
void Motor_SetSpeed(int8_t Speed)
{
	if(Speed < 0)		//正转
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_4);		//PA4置高电平
		GPIO_ResetBits(GPIOA, GPIO_Pin_5);		//PA5置低电平
		PWM_SetCompare3(-Speed);				//PWM设置为速度值
	}
	if(Speed >= 0)		//反转
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_5);
		GPIO_ResetBits(GPIOA, GPIO_Pin_4);
		PWM_SetCompare3(Speed);
	}
}

在主函数中通过按键增量或减量控制电机的速度:

#include "stm32f10x.h"    //添加头文件
#include "Delay.h"
#include "LED.h"
#include "KEY.h"
#include "Timer.h"
#include "OLED.h"
#include "PWM.h"
#include "Motor.h"

uint8_t KeyNum;		//接受按键返回值
int8_t Speed;		//定义速度变量

int main(void)
{
	/*模块初始化*/
	OLED_Init();	//OLED初始化
	Motor_Init();
	KEY_Init();
	
	OLED_ShowString(1, 1, "Motor:");		//OLED显示字符
	
	while(1)
	{	
		KeyNum = Key_GetNum();
		if(KeyNum == 1)
		{
			Speed+=20;
			if(Speed > 100)
			{
				Speed = -100;
			}
		}
		Motor_SetSpeed(Speed);
		OLED_ShowSignedNum(2, 1, Speed, 3);
	}
}

以上就是STM32控制直流电机正反转相关内容。



标签:include,舵机,Init,STM32,OLED,GPIO,PWM,Speed
From: https://blog.51cto.com/lion99/8863310

相关文章

  • STM32智能小车循迹教程
    (文章目录)前言本篇文章将带大家学习STM32智能小车的循迹功能。一、红外循迹模块工作原理及接线图红外循迹模块工作原理电路工作描述以其中一路为例TCRT5000传感器的红外发射二极管不断发射红外线,当发射的红外线没有被反射回来或者反射回的强度不够大时,红外接收管一直处于......
  • 带PWM 调光的线性降压 LED 恒流驱动器
    一、基本概述TX6410B是一种带PWM调光功能的线性降压LED恒流驱动器,仅需外接一个电阻就可以构成一个完整的LED恒流驱动电路,调节该外接电阻可调节输出电流,输出电流范围为10~2000mA。TX6410B内置30V50毫欧MOS。TX6410B内置过热保护功能,可有效保护芯片,避免因过热而造成损坏。......
  • PWM 调光的线性降压 LED 恒流驱动器
    一、基本概述TX6410是一种带PWM调光功能的线性降压LED恒流驱动器,仅需外接一个电阻就可以构成一个完整的LED恒流驱动电路,调节该外接电阻可调节输出电流,输出电流范围为10~2000mA。内置30V50毫欧MOS。内置过热保护功能,可有效保护芯片,避免因过热而造成损坏。具有很低的静态......
  • 【STM32】STM32启动流程
    概述从上电复位到main函数的过程主要由以下步骤:1.初始化堆栈指针SP=_initial_sp,初始化PC指针=Reset_Handler2.初始化中断向量表3.配置系统时钟4.调用C库函数_main初始化用户堆栈,然后进入main函数1.STM32的启动模式STM32的启动模式决定了向量表的位置,STM32有三种启动模式:(......
  • STM32在CTF中的应用和快速解题
    题目给的是bin文件,基本上就是需要我们手动修复的固件逆向。如果给的是hex文件,我们可能需要使用MKD进行动态调试主要还是以做题为目的详细的可以去看文档:https://pdf1.alldatasheet.com/datasheet-pdf/view/201596/STMICROELECTRONICS/STM32F103C8T6.htmlSVD文件下载:https://gi......
  • STM32学习随笔 12.13
    慢摸摸的学习之前跟着B站江协科技UP学51感觉没啥,学到STM32就感觉很吃力,又想钻研清楚,看到定时器TIM章节零零总总差不多耽搁快进一个月了总结下近期学到的东西学习掌握多元条件运算符,这样可以省略很多if()else()或者switch()case;语句示例:      i-=(i>10000)?10......
  • 51单片机--PWM
    芯片:STC8H1K28目的:呼吸灯这是一段官网下载的例程,配置了多路PWM,目前不知道具体寄存器赋值,先把能使用的代码贴上,后续再添加#defineTimer0_Reload(65536UL-(MAIN_Fosc/1000))//Timer0中断频率,1000次/秒#definePWMA_ENO(*(unsignedcharvolatilexdat......
  • STM32学习笔记_外部中断EXTI
    中断:在主程序中运行过程中,出现了特定的中断触发条件,使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。中断嵌套:当一个中断程序正在......
  • 怎么用stm32 flash来实现数据掉电不丢失
    参考战舰的FLASH模拟EEPROM实验 比如,#defineFLASHADDR_START0x08006800写:u32Data=0x20161109;FLASH_Unlock();FLASH_ErasePage(FLASHADDR_START);FLASH_ProgramWord(FLASHADDR_START,Data);FLASH_Lock();读:u32Data;Data=*(u32*)FLASHADDR_START;   ......
  • stm32 cubeide调试问题汇总
    stm32cubeide调试问题汇总1.STM32CubeIDE无法进行调试报以下错误Targetisnotresponding,retrying...Targetisnotresponding,retrying...Targetisnotresponding,retrying...Targetisnotresponding,retrying...Targetisnotresponding,retrying.........