STM32F103使用L9110s驱动直流电机(必须简单易懂)

首先我们来看一下L9110S的驱动手册:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意到IB接的是PB8,IA接的是PB9
根据第二个图片里面的真值表我们可以得到如下信息:
在这里插入图片描述

PB8配置位复用推挽输出,PB9配置为通用推挽
然后我给PB8配置PWM波,PB9给拉低,那么电机是不是就是正转
反转同理
停止两个端口同时拉低或者拉高就行了

在这里插入图片描述

接下里我们来配置一下PWM波,我们配置电机反转
PB9配置位复用推挽输出,PB8配置为通用推挽 然后我给PB9配置PWM波,PB8给拉低,那么电机是不是就是正转
看一下上图的定时器为TIM4,第4个管道。

void machinery_config(void)
{
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开时钟
	/*PB9 复用推挽输出*/
	GPIO_InitTypeDef GPIO_INIT;
	GPIO_INIT.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_INIT.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_INIT.GPIO_Pin = GPIO_Pin_9;
	GPIO_Init(GPIOB,&GPIO_INIT);

	GPIO_INIT.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_INIT.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_INIT.GPIO_Pin = GPIO_Pin_8;
	GPIO_Init(GPIOB,&GPIO_INIT);
	
	RCC->APB1ENR |=(0X01<<2);//开TIM4时钟
	//定时器4通道 9 CH4
	//时钟组成
	TIM4->PSC = 72;
	TIM4->ARR = 1000;
	TIM4->CNT = 0;	
		TIM4->CR1 &=~(0X01<<4);//计数方向--向上记数
		//配置PWM波 有效电平 PWM模式  输出到响应引脚
		TIM4->CCER &=~(0X01<<13);//高电平有效
		TIM4->CCMR2 |=(0X06<<12);//PWM模式1 PWM输出模式
		TIM4->CCER |=(0X01<<12);//OC4对应到PB9,将输出信号配置到指定管脚
		TIM4->CCR4=0;//比较值
		TIM4->CR1 |=(0X01<<0);//计数器使能
	GPIO_ResetBits(GPIOB,GPIO_Pin_8);//拉低PB8

}

这样我们是不是只需要改变配置里面的比较值(TIM4->CCR4)就可以实现电机的速度控制了
我们在主函数里这样简单测试一下,每延时3s我让比较值增加200:

		TIM4->CCR4=200;
		systick_ms(3000);
	    TIM4->CCR4=400;
		systick_ms(3000);
		TIM4->CCR4=600;
		systick_ms(3000);
		systick_ms(3000);
		TIM4->CCR4=800;
		systick_ms(3000);
		TIM4->CCR4=1000;
		systick_ms(3000);

ok!这里就结束了,如果你需要别的控制,你只需要在满足你的控制条件后,更改比较值就可以实现电机的速度控制了。
如有不同的见解,欢迎评论区或者私信交流指正。
感觉写的不错,拜托观众姥爷一键三连。你的认同是我更新最大的动力。
ps:我是真的懒啊!!!!!
再ps一下:步进电机和舵机后续再更

淘宝买了几个4g舵机,3.2一个,价格便宜,但是不带电路板和摆臂。 样子如下图,带5根线,2根电机线,3根电位器线。 拆开后,大概就是这个样子,可见棕色和白色两根线接电位器的两端,黄线接电位器中间。 我这里用的图,都是淘宝卖家拍的,下面的拆开图,是6g舵机的,但是接线是一样的。 万用表测量了一下,这个电位器是4.9K的,也就当5K吧。 这个舵机是萝莉群的群友推荐的,希望我能做个舵机的电路板出来驱动它。 一直拖了一个多星期吧,硬件电路是几天前就搭好了,今天下午大概写了一下代码,本来想用一下PID算法,显得高大上一点,不过后来看了看,这种东西比较简单,单纯的比例算法就可以了,不需要PID这么复杂。 思路大概解释一下。 电路板用了3个元件,一个STC15W408AS DIP16的单片机。 这个单片机带10位精度的ADC,刚好测量舵机里面电位器的位置。 然后电机驱动用的L9110 DIP8。 L9110最大电流0.8A,对于4g舵机的小空心杯电机来说,足够了。 而且L9110的电路也非常简单。 最后一个元件就是加了个47uf的电容。如果是改贴片元件,大概10uf和0.1uf两个贴片电容就差不多了。 L9110的基本应用电路如下: STC15W408AS DIP16 的引脚图如下: 顺便说一下,我用直插元件和洞洞板搭了一个驱动电路,没有采用贴片元件和打板子。 因为重点还是单片机的电路设计和编程,而不是做一个比较完美的成品。 4g舵机驱动板程序部分截图:
<think>好的,用户想了解如何使用STM32控制电机,特别是驱动和代码实现。我需要先理清用户的需求。可能用户是刚开始接触STM32和电机控制,所以需要从基础开始讲解。 首先,我应该解释STM32控制电机的基本结构,包括控制器、驱动器和电机本身。根据引用[1],控制器是STM32驱动器比如ULN2003,电机可能是28BYJ-48步进电机。这部分需要详细说明每个部分的作用,帮助用户建立整体概念。 接下来,硬件连接部分。需要列出具体的引脚连接方式,比如GPIO控制方向,定时器生成PWM。引用[2]提到GPIO和定时器的配置,这里要具体说明如何设置,比如使用TIM3的CH1通道输出PWM,并举例对应的GPIO引脚,比如PA6。同时,驱动器模块的IN1-IN4连接哪些GPIO引脚,比如PB8-PB11,这样用户能清楚如何接线。 然后是代码实现部分。用户可能需要示例代码来参考。需要分步骤讲解初始化函数,包括GPIO和定时器的配置。PWM生成的代码示例很重要,要展示如何设置周期和占空比。方向控制函数也需要具体代码,比如设置GPIO的高低电平来控制转向。主函数中的循环示例,展示如何调用这些函数,结合按键控制,这样用户能理解整体流程。 可能用户对PWM的具体配置不太熟悉,需要解释定时器的相关参数,比如预分频器和自动重装载值如何计算,以产生特定频率的PWM信号。同时,占空比的计算方法也需要说明,比如如何根据速度需求调整ARR的值。 另外,需要考虑用户可能遇到的问题,比如电机的抖动或无法启动,可能涉及到PWM频率不合适或者驱动电流不足,可以给出一些调试建议,比如调整频率或检查电源。 最后,生成的相关问题需要覆盖电机的其他类型(如直流电机)、速度控制方法、步进电机细节以及常见问题处理,这样用户如果有进一步的问题,可以继续探索。 总结下来,回答需要结构清晰,从硬件到代码逐步讲解,结合引用中的信息,确保示例代码正确,并且语言简洁易懂,适合刚入门的用户。</think>### STM32控制电机驱动及代码实现分步说明 (以28BYJ-48步进电机为例,结合ULN2003驱动器) #### 一、硬件架构 1. 系统组成: - 控制器:STM32F103C8T6(通用型) - 驱动器:ULN2003达林顿管阵列 - 电机:28BYJ-48四相五线步进电机 - 电源模块:外接5V/1A独立电源 2. 引脚连接: ```c // TIM3_CH1 -> PA6(PWM输出) // IN1 -> PB8 | IN2 -> PB9 // IN3 -> PB10 | IN4 -> PB11 ``` #### 二、代码实现 1. GPIO初始化: ```c void GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 方向控制引脚配置 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); } ``` 2. PWM定时器配置: ```c void PWM_Init(uint16_t arr, uint16_t psc) { TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 时基单元配置 TIM_InitStruct.TIM_Period = arr; // 自动重装载值 TIM_InitStruct.TIM_Prescaler = psc; // 预分频系数 TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_InitStruct); // PWM模式配置 TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse = 0; // 初始占空比0% TIM_OC1Init(TIM3, &TIM_OCInitStruct); TIM_Cmd(TIM3, ENABLE); TIM_CtrlPWMOutputs(TIM3, ENABLE); } ``` 3. 方向控制函数: ```c void SetDirection(uint8_t dir) // 0-顺时针,1-逆时针 { if(dir == 0){ GPIO_SetBits(GPIOB, GPIO_Pin_8); GPIO_ResetBits(GPIOB, GPIO_Pin_9); } else { GPIO_ResetBits(GPIOB, GPIO_Pin_8); GPIO_SetBits(GPIOB, GPIO_Pin_9); } } ``` 4. 主函数示例: ```c int main(void) { SystemInit(); GPIO_Init(); PWM_Init(999, 71); // 产生10kHz PWM(72MHz/(71+1)/(999+1)) while(1) { SetDirection(0); // 设置方向 TIM_SetCompare1(TIM3, 500); // 50%占空比 Delay_ms(2000); TIM_SetCompare1(TIM3, 800); // 80%占空比 Delay_ms(2000); } } ``` #### 三、关键参数计算 1. PWM频率公式: $$ f_{PWM} = \frac{f_{CK\_PSC}}{(PSC+1)(ARR+1)} $$ 其中$f_{CK\_PSC}$为定时器时钟频率(72MHz) 2. 占空比计算: $$ DutyCycle = \frac{Pulse}{ARR+1} \times 100\% $$ 通过TIM_SetCompare1()函数设置Pulse值 [^1]: 步进控制系统组成 [^2]: PWM控制原理
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值