【嵌入式实战分享】电机篇(上) 一些简单的减速电机

项目背景

设计制作一个四轮电动小车。要求小车能沿着指定路线在坡道上自动循迹骑线行驶。小车必须独立运行,车外不能使用任何设备(包括电源)。坡道的长、宽约 1m ,坡道可以使用任何材质的板子制作,只要不发生弯曲即可。板子表面铺设画有 1cm×1cm, 黑白间隔的纸条(以下简称为标记线)作为路线指示;标记线起始段为直线,平行于板子两边;标记线在坡顶转向 90°,转弯半径 20cm;标记线平行坡顶距离≥30cm,距坡顶距离≤20cm;标记线总长度为 1m。停车标记为宽 1cm 长 5cm 的黑色线条,垂直于坡顶标记线。小车坡度角示意及行驶线路顶视图如图 1 所示。

在这里插入图片描述


电机介绍

根据上述项目要求,我们可以用一些常见的消费产品所用的电机;下面我们举几个在本项目中考虑到的例子,

1、引脚说明

【如何使用】【怎样接线】

130直流电机(带减速箱)

图片源自https://item.taobao.com/item.htm?spm=a21n57.1.0.0.1e08523cQBQGyY&id=522572025351&ns=1&abbucket=18#detail

重量较轻,体积适中;

电机有两个引脚无极性;电机的转向因引脚接线极性而定,随引脚接线的极性变化而变化,电机的速度因电压变化而变化,若要有稳定的速度需要稳压

N20微型直流减速电机

在这里插入图片描述

图片源自https://item.taobao.com/item.htm?spm=a21n57.1.0.0.1e08523cQBQGyY&id=723388933405&ns=1&abbucket=18#detail

体积较小,质量密度适中

电机有两个引脚无极性;电机的转向因引脚接线极性而定,随引脚接线的极性变化而变化,电机的速度因电压变化而变化,若要有稳定的速度需要稳压

JGA25-370减速电机

在这里插入图片描述

图片源自https://detail.tmall.com/item.htm?abbucket=18&id=662425775377&ns=1&spm=a21n57.1.0.0.1e08523cQBQGyY

体积较大,质量偏大

电机有两个引脚无极性;电机的转向因引脚接线极性而定,随引脚接线的极性变化而变化,电机的速度因电压变化而变化,若要有稳定的速度需要稳压

2、电机结构

【机械原理】【电机特点】

130直流电机(带减速箱)

在这里插入图片描述

1.工作电压:3-6V
2 .减速比:1:48
3.双轴(两边白色的轴就是双轴的含义)
4.电机加EMC,抗干扰能力强
5.使用范围:有科研电子产品类、机器人电动人体类、泡泡枪玩具枪体类、四驱车玩具汽车类、飞机玩具类、震动产品类等电动玩具产品

N20微型直流减速电机

在这里插入图片描述
在选择此电机的时候,我们一定要注意电机的参数,

如果要求力矩大的场景,我们可以选择转速低的电机,但是速度会相对较,然后就是工作电压,一定要小心烧坏电机;

对于我个人而言来说,一般情况下,做平地上的智能小车,用的是120转,6V;如果对场地有特殊要求的话,可能要用一些转速较小的电机,它们的力矩矩较大一些
在这里插入图片描述

JGA25-370减速电机

在这里插入图片描述
部分参数表
在这里插入图片描述

详情见店铺https://detail.tmall.com/item.htm?abbucket=18&id=662425775377&ns=1&spm=a21n57.1.0.0.1e08523cQBQGyY

3、使用介绍

经过上面的一些介绍我们发现,他们没有一些高级的控制器——编码器、变频器等,也没有什么特殊的控制方式,只是根据通电引脚的电压大小而进行速度的变化。

因此我们在这里先介绍一个PWM电机控制算法

PWM(pulse width modulation, 简称脉宽调制),是基于伏秒平衡原则实现对输入电压大小的调制。
在这里插入图片描述

有上图可以看出频率F的值为1/T,占空比D的值为T高/(T高+T低)。 通过改变单位时间脉冲的个数可以实现调频; 通过改变占空比可以实现调压。 占空比越大,所得到的平均电压也就越大,幅值也就越大; 占空比越小,所得到的平均电压也就越小,幅值也就越小。

4、驱动代码

这里用一个for循环简单展示一下PWM算法的思路(语法不严谨)

#define PWM_FREQUENCY 1000 // PWM频率为1kHz  
#define DUTY_CYCLE 50 // 占空比为50%  
-----
for(int count=0;count<PWM_FREQUENCY ;count++)
{
	if(count<DUTY_CYCLE )	printf("高电平");
	else 	printf("低电平");
}

5、应用编程

寄存器类代码,以51为例如下(示例):

#include <reg52.h> //包含头文件,定义单片机的寄存器  
  
#define uchar unsigned char //定义uchar类型为unsigned char  
#define uint unsigned int   //定义uint类型为unsigned int  
  
sbit PWM=P1^0; //定义PWM输出引脚  
  
void Timer0Init(void) //定时器初始化  
{  
    TMOD=0x01; //设置定时器模式  
    TH0=(65536-50000)/256; //设置定时器初值,频率为1kHz  
    TL0=(65536-50000)%256;  
    ET0=1; //开启定时器中断  
    EA=1; //开启总中断  
    TR0=1; //启动定时器  
}  
  
void Timer0() interrupt 1 using 1 //定时器中断服务例程  
{  
    static uchar duty=0; //占空比变量,初始化为0  
    if(duty==0) //如果占空比为0,则将PWM置高电平  
    {  
        PWM=1;  
    }  
    else //否则将PWM置低电平  
    {  
        PWM=0;  
    }  
    duty++; //占空比增加,达到50%后重新开始计数  
    if(duty==PWM_DUTY) //如果占空比达到最大值,则清零占空比变量,重新开始计数  
    {  
        duty=0;  
    }  
}  
  
void main()   
{  
    uchar PWM_DUTY=255; //定义占空比最大值,可以根据需要调整  
    Timer0Init(); //调用定时器初始化函数  
    while(1)   
    {  
        //主循环可以根据需要进行其他操作,例如读取传感器数据等。  
    }  
}

上述代码使用了定时器0来实现PWM。

在主函数中,我们首先定义了占空比的最大值PWM_DUTY。然后,我们调用Timer0Init()函数来初始化定时器,并将其设置为模式1(8位自动重装载模式)。接下来,我们定义了一个静态变量duty来存储占空比,并将其初始化为0。在Timer0()中断服务例程中,我们根据占空比的值来控制PWM的输出电平。如果占空比为0,则将PWM置高电平;否则将PWM置低电平。然后,我们将占空比增加1,直到达到最大值PWM_DUTY后重新开始计数。最后,在主循环中可以根据需要进行其他操作。

库函数类代码,以32为例如下(示例):

#include "stm32f10x.h"                  // Device header


#include "PWM.h"

uint8_t i;

void PWM_Init();
void PWM_SetCompare1(uint16_t Compare);

int main(void)
{
	PWM_Init();
	
	while (1)
	{
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(i);
			//Delay_ms(10);可以适当延时
		}
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(100 - i);
			//Delay_ms(10);//可以适当延时
		}
	}
}

void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
//	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		//GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;		//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);
	
	TIM_Cmd(TIM2, ENABLE);
}

void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare);
}

这个程序使用了STM32库函数来初始化PWM和定时器,并通过设置比较匹配值来控制PWM的占空比。通过调整占空比。因为32有一些库函数方便我们调用,因此开发周期大大缩短。


使用总结

1.问题描述

在爬坡中小车滑落

在这里插入图片描述

在坡顶行驶时小车滑落

在这里插入图片描述

2.原因分析

在爬坡中小车滑落

根据题目需求,我们需要抓地力较强的轮胎和扭矩较大的电机,防止我们的小车在半坡滑落。但是再实际情况爬坡中坡度越大,小车上升的就越吃力,如果电机扭矩较大的话效果还好一些,在这里我们可以选用一些工作电压小,扭矩大的减速电机
在这里插入图片描述

在爬坡中小车滑落

但是是在平行于坡底时,小车极其容易滑落,因为这时的滑落与否不再与电机扭矩大小有关,而是与轮胎的摩擦力等一些其他因素有关,需要一些其他的措施保证
在这里插入图片描述

<think>好的,我现在需要帮助用户了解如何将JGA25-370电机与Arduino Uno R3连接。首先,我得确认用户提到的JGA25-370电机的类型。因为不同的电机(比如直流电机、步进电机、舵机等)连接方式不同。JGA25-370通常是一种直流减速电机,常用于需要较大扭矩的应用,比如机器人小车。 接下来,用户可能想控制电机的启停、速度和方向,因此可能需要一个电机驱动模块,比如L298N或L293D,因为Arduino Uno的数字引脚输出电流有限,无法直接驱动电机。这时候需要确认用户是否已经有驱动模块,或者需要推荐合适的型号。 然后,考虑到JGA25-370的工作电压,通常这类电机的电压范围可能在3-12V左右。而Arduino Uno的电源输出可能不足以直接驱动电机,所以需要外接电源。这时候需要提醒用户注意电源的选择,避免电流不足或电压过高损坏电机或Arduino。 接下来是具体的连接步骤。假设用户使用L298N驱动模块,需要将电机的两根线连接到驱动模块的输出端。然后,驱动模块的控制引脚需要连接到Arduino的数字引脚,比如IN1和IN2对应方向控制,ENA使能引脚用于PWM调速。同时,驱动模块的电源需要外接,可能需要将电池的正负极连接到驱动模块的电源输入,并且共地处理,将Arduino的GND和驱动模块的GND连接,确保参考电位一致。 然后,用户可能需要编写代码来控制电机。例如,设置控制引脚为输出,使用analogWrite()函数调节速度,digitalWrite()改变方向。这时候需要给出示例代码的框架,并提醒用户根据实际引脚调整代码中的数字。 还要注意安全事项,比如先接线后通电,避免短路,确保电源电压匹配,以及可能的散热问题,尤其是高负载情况下驱动模块可能会发热。 最后,需要检查是否有遗漏的步骤,或者是否需要额外的元件,比如二极管保护电路或滤波电容,但通常驱动模块已经内置这些保护措施,所以可能不需要特别提及,除非用户遇到特定问题。 总结一下,回答的结构应该是先确认电机类型和所需驱动模块,然后分步骤讲解硬件连接,接着提供示例代码,最后强调注意事项。确保用户能够逐步跟随操作,避免常见错误。</think>要将JGA25-370直流减速电机与Arduino Uno R3连接,需通过电机驱动模块控制。以下是分步指南: --- ### **一、准备材料** - JGA25-370电机(工作电压:6-12V,建议9V) - Arduino Uno R3 - 电机驱动模块(如L298N或L293D) - 外接电源(9V电池或电源适配器) - 杜邦线若干 --- ### **二、连接步骤** #### **1. 电机与驱动模块连接** -电机的两根线接到驱动模块的**输出端口**(如L298N的`OUT1`和`OUT2`)。 #### **2. 驱动模块与Arduino连接** - **控制引脚**: - `IN1` → Arduino数字引脚(如D2) - `IN2` → Arduino数字引脚(如D3) - `ENA` → Arduino PWM引脚(如D9,用于调速) #### **3. 电源连接** - **驱动模块电源**: - 外接电源正极 → 驱动模块的`+12V`输入 - 外接电源负极 → 驱动模块的`GND` - **共地处理**: - 驱动模块的`GND` → Arduino的`GND` --- ### **三、示例代码** ```cpp // 定义引脚 const int IN1 = 2; const int IN2 = 3; const int ENA = 9; void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(ENA, OUTPUT); } void loop() { // 正向转动(速度50%) digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); analogWrite(ENA, 128); // PWM值范围0-255 delay(2000); // 停止 digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); delay(1000); // 反向转动(速度75%) digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); analogWrite(ENA, 192); delay(2000); } ``` --- ### **四、注意事项** 1. **电源隔离**:避免直接通过Arduino供电,否则可能烧毁主板。 2. **电压匹配**:JGA25-370建议电压为9V,外接电源需匹配。 3. **共地必需**:确保Arduino与驱动模块的`GND`相连。 4. **散热保护**:长时间高负载运行时,驱动模块需散热。 --- ### **五、常见问题** - **电机不转**:检查共地是否连接,PWM引脚是否输出信号。 - **驱动模块发热**:正常现象,避免持续超负荷运行。 通过以上步骤,即可实现Arduino Uno对电机的方向和速度控制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值