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

目录

  • 项目背景
  • 电机介绍
    • 1、引脚说明
    • 130直流电机(带减速箱)
    • N20微型直流减速电机
    • JGA25-370减速电机
    • 2、电机结构
    • 130直流电机(带减速箱)
    • N20微型直流减速电机
    • JGA25-370减速电机
    • 3、使用介绍
    • 4、驱动代码
    • 5、应用编程
  • 使用总结
    • 1.问题描述
    • 2.原因分析

项目背景

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

【嵌入式实战分享】电机篇(上) 一些简单的减速电机_第1张图片


电机介绍

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

1、引脚说明

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

130直流电机(带减速箱)

【嵌入式实战分享】电机篇(上) 一些简单的减速电机_第2张图片

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

重量较轻,体积适中;

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

N20微型直流减速电机

【嵌入式实战分享】电机篇(上) 一些简单的减速电机_第3张图片

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

体积较小,质量密度适中

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

JGA25-370减速电机

【嵌入式实战分享】电机篇(上) 一些简单的减速电机_第4张图片

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

体积较大,质量偏大

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

2、电机结构

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

130直流电机(带减速箱)

【嵌入式实战分享】电机篇(上) 一些简单的减速电机_第5张图片

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

N20微型直流减速电机

【嵌入式实战分享】电机篇(上) 一些简单的减速电机_第6张图片
在选择此电机的时候,我们一定要注意电机的参数,

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

对于我个人而言来说,一般情况下,做平地上的智能小车,用的是120转,6V;如果对场地有特殊要求的话,可能要用一些转速较小的电机,它们的力矩矩较大一些
【嵌入式实战分享】电机篇(上) 一些简单的减速电机_第7张图片

JGA25-370减速电机

【嵌入式实战分享】电机篇(上) 一些简单的减速电机_第8张图片
部分参数表
【嵌入式实战分享】电机篇(上) 一些简单的减速电机_第9张图片

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

3、使用介绍

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

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

PWM(pulse width modulation, 简称脉宽调制),是基于伏秒平衡原则实现对输入电压大小的调制。
【嵌入式实战分享】电机篇(上) 一些简单的减速电机_第10张图片

有上图可以看出频率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  //包含头文件,定义单片机的寄存器  
  
#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.问题描述

在爬坡中小车滑落

【嵌入式实战分享】电机篇(上) 一些简单的减速电机_第11张图片

在坡顶行驶时小车滑落

【嵌入式实战分享】电机篇(上) 一些简单的减速电机_第12张图片

2.原因分析

在爬坡中小车滑落

根据题目需求,我们需要抓地力较强的轮胎和扭矩较大的电机,防止我们的小车在半坡滑落。但是再实际情况爬坡中坡度越大,小车上升的就越吃力,如果电机扭矩较大的话效果还好一些,在这里我们可以选用一些工作电压小,扭矩大的减速电机
【嵌入式实战分享】电机篇(上) 一些简单的减速电机_第13张图片

在爬坡中小车滑落

但是是在平行于坡底时,小车极其容易滑落,因为这时的滑落与否不再与电机扭矩大小有关,而是与轮胎的摩擦力等一些其他因素有关,需要一些其他的措施保证
【嵌入式实战分享】电机篇(上) 一些简单的减速电机_第14张图片

你可能感兴趣的:(模块介绍,单片机,嵌入式硬件)