将微型伺服电机与Atmega16连接起来的方法

将微型伺服电机与Atmega16连接起来的方法,第1张

  伺服电机广泛用​​于需要精确控制的地方,如机器人、自动化机械、机械臂等。然而,伺服电机的范围并不限于此,可以在许多应用中使用。

  在本教程中,我们将使用 Atmel Studio 7.0将微型伺服电机与 Atmega16 AVR 微控制器连接起来。伺服电机额定工作电压为4.8-6V。我们可以通过应用脉冲串或PWM信号来控制它的旋转角度和方向。请注意,伺服电机不能移动完整的 360 度旋转,因此它们用于不需要连续旋转的地方。旋转角度为 0 -180 度或 (-90) – (+90) 度。

  所需组件

  SG90 Tower Pro 微型伺服电机

  Atmega16微控制器IC

  16Mhz 晶体振荡器

  两个 100nF 电容器

  两个 22pF 电容

  按钮

  跳线

  面包板

  USBASP v2.0

  LED(任何颜色)

  伺服电机引脚说明

将微型伺服电机与Atmega16连接起来的方法,pYYBAGMa5EyADtVMAARPvcDlllo978.png,第2张

  红色 = 正电源(4.8V 至 6V)

  棕色 = 接地

  橙色 = 控制信号(PWM 引脚)

  电路原理图

  如下图所示连接所有组件,以使用 AVR 微控制器旋转伺服电机。有四个 PWM 引脚,我们可以使用 Atmega16 的任何 PWM 引脚。在本教程中,我们使用引脚 PD5 (OC1A) 来生成PWM。PD5直接接伺服电机橙色线,为输入信号脚。连接任何颜色的电源指示灯。此外,在复位引脚中连接一个按钮,以便在需要时复位 Atmega16。将 Atmega16 与适当的晶体振荡器电路连接。所有系统将由 5V 电源供电。

将微型伺服电机与Atmega16连接起来的方法,poYBAGMa5EeAY0w7AADN9KLnAd8564.png,第3张

将微型伺服电机与Atmega16连接起来的方法,pYYBAGMa5EOARwpiAAWWxTW-eT4297.png,第4张

  完整的设置如下所示:

将微型伺服电机与Atmega16连接起来的方法,poYBAGMa5D-ANXFnAAa_zVRpzd8283.png,第5张

  用 AVR ATmega16 控制伺服电机

  与步进电机一样,伺服电机不需要任何外部驱动器,例如 ULN2003 或 L293D 电机驱动器。只需 PWM 就足以驱动伺服电机,并且很容易从微控制器生成 PWM。这个伺服电机的扭矩是2.5kg/cm,所以如果你需要更大的扭矩那么这个伺服是不合适的。

  众所周知,伺服电机每20ms寻找一个脉冲,正脉冲的长度将决定伺服电机的旋转角度。

将微型伺服电机与Atmega16连接起来的方法,poYBAGMa5DuAX3GMAABcg1CTIX4619.png,第6张

  获得 20ms 脉冲所需的频率为 50Hz (f = 1/T)。所以对于这个伺服电机,规范说0度需要0.388ms,90度需要1.264ms,180度需要2.14ms脉冲。

  为了生成指定的脉冲,我们将使用 Atmega16 的 TImer1。CPU 频率为 16Mz,但我们将只使用 1Mhz,因为我们没有太多外围设备连接到微控制器并且微控制器上的负载也不大,所以 1Mhz 就可以完成这项工作。预分频器设置为 1。因此时钟被划分为 1Mhz/1 = 1Mhz (1uS),这很好。TImer1将用作快速 PWM 模式,即模式 14。您可以使用不同的定时器模式来生成所需的脉冲序列。参考如下,您可以在Atmega16 Official Datasheet中找到更多描述。

将微型伺服电机与Atmega16连接起来的方法,pYYBAGMa5DeASNB3AAFOJaBwP4o417.png,第7张

  要将TImer1 用作快速 PWM模式,我们需要 ICR1(输入捕捉寄存器 1)的 TOP 值。要找到 TOP 值,请使用下面给出的公式:

  f pwm = f cpu / nx (1 + TOP)

  这可以简化为,

  TOP = ( f cpu / ( f pwm xn)) – 1

  其中,N = 预分频器设置的值

  f cpu = CPU 频率

  f pwm =伺服电机脉冲宽度,即 50Hz

  现在计算 ICR1 值,因为我们拥有所需的所有值,

  N = 1,f cpu = 1MHz,f pwm = 50Hz

  只需将值放在上面的公式中,我们就会得到

  ICR1 = 1999

  这意味着要达到最大程度,即 180 0,ICR1 应该是 1999。

  对于 16MHz 晶振和预分频器设置为 16,我们将有

  ICR1 = 4999

  现在让我们继续讨论草图。

  使用 USBasp 编程 Atmega16

  下面给出了用于控制伺服电机的完整 AVR 代码。代码很简单,很容易理解。

  在这里,我们对 Atmega16 进行了编码,以将伺服电机从 0 0旋转到 180 0并再次从 180 0旋转到 0 0。此转换将在 9 个步骤中完成,即 0 – 45 – 90 – 135 – 180 – 135 – 90 – 45 – 0。对于延迟,我们将使用 Atmel Studio 的内部库,即 《uTIl/delay.h》

  连接您的 USBASP v2.0 并按照此链接中的说明使用 USBASP 和 Atmel Studio 7.0 对 Atmega16 AVR 微控制器进行编程。只需使用外部工具链构建草图并上传即可。
 

#define F_CPU 1000000UL

#include

#include

无效的主要()

{

//配置TIMER1

TCCR1A|=(1<

TCCR1B|=(1<

ICR1=19999;//fPWM=50Hz(周期 = 20ms 标准)。

DDRD|=(1<

而(1)

{

        OCR1A=0;//0度

        _delay_ms(1000);

OCR1A=600;//45度 

_delay_ms(1000);

OCR1A=950;//90度 

_delay_ms(1000);

OCR1A=1425;//135度 

_delay_ms(1000);

OCR1A=1900;//180度 

_delay_ms(1000);

    OCR1A=1425;//135度

        _delay_ms(1000);

OCR1A=950;//90度

_delay_ms(1000);

OCR1A=650;//45度

_delay_ms(1000);

}

}

#define F_CPU 1000000UL

#include

#include

无效的主要()

{

//配置TIMER1

TCCR1A|=(1<

TCCR1B|=(1<

ICR1=19999;//fPWM=50Hz(周期 = 20ms 标准)。

DDRD|=(1<

而(1)

{

        OCR1A=0;//0度

        _delay_ms(1000);

OCR1A=600;//45度 

_delay_ms(1000);

OCR1A=950;//90度 

_delay_ms(1000);

OCR1A=1425;//135度 

_delay_ms(1000);

OCR1A=1900;//180度 

_delay_ms(1000);

    OCR1A=1425;//135度

        _delay_ms(1000);

OCR1A=950;//90度

_delay_ms(1000);

OCR1A=650;//45度

_delay_ms(1000);

}

}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2998471.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-26
下一篇 2022-09-26

发表评论

登录后才能评论

评论列表(0条)

保存