使用PWM技术通过ATtiny13微控制器控制伺服电机

使用PWM技术通过ATtiny13微控制器控制伺服电机,第1张

  伺服电机的工作原理是脉冲宽度调制(PWM),其旋转角度由施加到其控制引脚的脉冲持续时间控制。在本教程中,我们将使用 PWM 技术通过 ATTIny13 微控制器控制伺服电机。因此,在继续之前,我们将首先了解PWM、伺服电机以及如何使用 Arduino Board 对 ATTIny13 进行编程。

  脉宽调制 (PWM)

  脉冲宽度调制(PWM) 被定义为一种使用数字源生成模拟信号的方法。PWM 信号由两个主要部分组成——占空比和频率。这些组件定义了它的行为。占空比描述了信号处于高电平状态的时间量。它表示为完成一个周期所需的总时间的百分比。

  占空比=开启时间/(开启时间+关闭时间)

  频率定义了 PWM 完成一个周期的速度以及信号在高低状态之间切换的速度。100Hz 的频率意味着每秒 100 个周期。通过以一定的占空比快速切换数字信号的开和关,输出将看起来像一个恒定电压的模拟信号。PWM 的强大优势之一是功率损耗非常小。

使用PWM技术通过ATtiny13微控制器控制伺服电机,poYBAGMIeLeAN_g7AAAxph8q6cI577.png,第2张

  PWM 信号用于各种控制应用。PWM 信号的主要目的是控制提供给各种电气设备的电力,尤其是提供给交流/直流电机等惯性负载的电力。它还可用于控制泵、阀门、液压系统和其他机械部件。PWM 信号的频率取决于被供电设备的应用和响应时间。

  使用 PWM 信号控制伺服电机

  伺服电机由三根线组成,其中两根用于电源(正极和负极),一根控制线用于从微控制器发送的信号。伺服电机基本上由一个由电位器和一些齿轮控制的直流电机组成。直流电机的高速力通过齿轮转换为扭矩。在直流电机中,力较小且速度较高,而在伺服电机中,力较大且速度较慢。电位器连接到伺服电机的输出轴以计算角度并将直流电机停止在所需的角度。要了解有关伺服的更多信息,请参阅有关伺服电机的详细文章。

使用PWM技术通过ATtiny13微控制器控制伺服电机,pYYBAGMIeLOARX6KAAGua2hubIk214.png,第3张

  伺服电机由脉冲宽度调制 (PWM) 控制或通过控制线发送可变宽度的电脉冲。会有重复率、最小脉冲和最大脉冲。伺服电机可以从中性位置向任一方向转动 90度,总共移动 180度。电机的中性位置是伺服在顺时针和逆时针方向具有相同的潜在旋转量的位置。发送到电机的 PWM 信号决定了轴的位置。转子将根据通过控制线发送的脉冲持续时间转到所需位置。伺服电机每 20 毫秒 (ms) 需要一个脉冲,脉冲的长度决定了电机转动的距离。

  伺服电机可以从 0 度旋转到 180 度。当一个 1.5ms 的脉冲被提供给控制线时,电机将转到 90 o位置。当给定一个小于 1.5ms 的脉冲时,电机将沿逆时针方向向 0 o位置移动。如果给出一个超过 1.5ms 的脉冲,那么电机将顺时针方向转向 180 o位置。

使用PWM技术通过ATtiny13微控制器控制伺服电机,poYBAGMIeK-AZ9KhAABcRFfRAW4100.png,第4张

  所有伺服电机都直接使用 +5V 电源工作,但我们必须注意电机消耗的电流量。如果我们使用两个以上的伺服电机,则应设计适当的伺服屏蔽。

  使用 Arduino 编程 ATTIny13

  AtTIny13 可以使用 Arduino Uno 或任何其他 Arduino 板进行编程。如下图所示将 Attiny13 连接到 Arduino Uno。

  Arduino 5V – ATtiny13 引脚 8

  Arduino GND – ATtiny13 引脚 4

  Arduino 引脚 13 – ATtiny13 引脚 7

  Arduino 引脚 12 – ATtiny13 引脚 6

  Arduino 引脚 11 – ATtiny13 引脚 5

  Arduino 引脚 10 – ATtiny13 引脚 1

使用PWM技术通过ATtiny13微控制器控制伺服电机,poYBAGMIeKqAII0LAAFG3HFK-e4316.png,第5张

  Arduino 被设置为程序员来编程 ATtiny13。这是通过将 ArduinoISP 草图上传到 Arduino 来完成的。此 Arduino 草图可在 Arduino IDE 的示例中找到。打开 Arduino IDE 并转到文件 》 示例 》 ArduinoISP。

使用PWM技术通过ATtiny13微控制器控制伺服电机,pYYBAGMIeKaARbreAABuAViWMAs239.png,第6张

  现在将d出 ArduinoISP 的程序。将程序上传到 Arduino Uno。

使用PWM技术通过ATtiny13微控制器控制伺服电机,poYBAGMIeKKAZaaaAABiALzMpQQ203.png,第7张

  Arduino Uno 现在已准备好对 Attiny13 进行编程。但是我们必须通过安装其核心文件来设置 Attiny。为此,请转到Arduino IDE中的文件》》首选项

使用PWM技术通过ATtiny13微控制器控制伺服电机,poYBAGMIeJ6AAlVCAABQ88uWadM415.png,第8张

  然后会d出一个新窗口。并在“ Additional Board Manager URL‘s ”中添加以下链接,然后单击“OK”。

  “ https://raw.githubusercontent.com/sleemanj/optiboot/master/dists/package_gogo_diy_attiny_index.json ”

使用PWM技术通过ATtiny13微控制器控制伺服电机,pYYBAGMIeJqAM4UrAAE-sq_fXhA321.png,第9张

  现在在您的 Arduino IDE 中转到Tools》》Board》》Boards Manager

使用PWM技术通过ATtiny13微控制器控制伺服电机,pYYBAGMIeJWAUFiRAACaBdcDJuk964.png,第10张

  然后会d出另一个窗口,在搜索框中输入“Attiny”然后你会得到“DIY ATtiny”然后点击“安装”按钮(我已经安装了它,这就是为什么安装按钮是灰色的)

使用PWM技术通过ATtiny13微控制器控制伺服电机,poYBAGMIeJCAWe7eAAB_qJQtA8M917.png,第11张

  要开始对 ATtiny 13 进行编程,我们必须将 Bootloader 烧录到它。为此,请转到工具 》 板 》 ATtiny13。

使用PWM技术通过ATtiny13微控制器控制伺服电机,poYBAGMIeIyATD0KAAEk2b_H28U432.png,第12张

  现在转到工具 》 处理器版本并检查是否选择了正确的 ATtiny 版本。根据您的芯片选择 ATtiny13 或 ATtiny13a。

  然后单击工具菜单底部的刻录引导加载程序按钮。

使用PWM技术通过ATtiny13微控制器控制伺服电机,pYYBAGMIeImAYQB9AAFlYUUjlBw863.png,第13张

  烧录引导加载程序后,现在可以对 ATtiny 进行编程了。现在你可以上传你的程序了。

  所需组件

  ATtiny13 微控制器

  伺服电机

  电位器

  +5V 电池

  Arduino IDE

  连接线

  电路图和工作

  下面给出了使用带有 ATtiny13 的电位器控制伺服电机的电路图。

使用PWM技术通过ATtiny13微控制器控制伺服电机,poYBAGMIeIOANI0qAAF83zStDf4291.png,第14张

  下面是连接

  将伺服电机控制引脚连接到 ATtiny13 的引脚 5

  将伺服电机的接地连接到 ATtiny13 的引脚 4

  将伺服电机的 VCC 连接到 ATtiny13 的引脚 8

  将电位器的中间引脚连接到 ATtiny13 的引脚 7

  将电位器的第一个和第三个引脚连接到 VCC 和 GND。

  将 +5V 电池正极连接到 ATtiny13 的引脚 8

  将 +5V 电池的负极连接到 ATtiny13 的引脚 4

使用PWM技术通过ATtiny13微控制器控制伺服电机,poYBAGMIeH-ADYmdAAA_J7wM8Vw995.png,第15张

  电位器连接到 ATtiny13 的引脚 7 (PB2),伺服电机的控制线连接到引脚 5 (PB0)。

使用PWM技术通过ATtiny13微控制器控制伺服电机,pYYBAGMIeHuAdTWMAAn4-1Vsyag788.png,第16张

  此处读取电位计值并将其转换为 0 到 180 之间的值。然后将该角度值转换为微秒,并以计算出的微秒延迟将脉冲提供给伺服电机的控制引脚。

#define F_CPU 9600000

int 伺服 = PB0; //连接舵机到PB0

长角;

整数脉宽调制;

#include

void adc_setup (void)

{

// 将 ADC 输入设置为 PB2/ADC1

ADMUX |= (1 << MUX0);

ADMUX |= (1 << ADLAR);

// 将预分频器设置为时钟/128 并启用 ADC

// 在 9.6 MHz 时为 75 kHz。

ADCSRA |= (1 << ADPS1) | (1 << ADPS0) | (1 << 阿登);

}

int adc_read (void)

{

// 开始转换

ADCSRA |= (1 << ADSC);

// 等待它完成

while (ADCSRA & (1 << ADSC));

返回 ADCH;




pinMode(伺服,输出);// 将伺服设置为输出引脚

}

void loop ()

{

long a;

adc_setup();

a = adc_read(); // 读取电位器值

angle = (a * 3) / 2; // 将读数转换为 0 到 180 之间的角度

。servoPulse(servo, angle); // 调用servoPulse 函数。

}

void serverPulse (int 伺服,int 角度)

{

pwm = (angle * 11) + 500; // 将角度转换为微秒

digitalWrite(servo, HIGH);

延迟微秒(pwm);

数字写入(伺服,低);

延迟(50);// 伺服刷新周期

}
 

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

原文地址: http://outofmemory.cn/dianzi/3000080.html

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

发表评论

登录后才能评论

评论列表(0条)

保存