雷竞技注册
项目

通过USB使用SAM4S Xplate Pro伺服控制

2016年4月22日经过罗伯特·凯

本文系列中的一部分侧重于硬件设置和使用脉冲宽度调制信号来控制伺服。

本文系列中的一部分侧重于硬件设置和使用脉冲宽度调制信号来控制伺服。

支持信息

必需的硬件/软件

另一个PWM应用程序

如果您通过“支持信息”下列出的文章,您将注意到我最近使用脉冲宽度调制信号(在低通滤波器的帮助)中涵盖了相当多的信息作为廉价的数字 -到模拟转换器。在探索本主题的过程中,我演示了如何使用SAM4S Xplate Pro开发平台生成PWM信号。通过所有这些PWM业务在我们的脑海中,我认为看看PWM信号的另一个标准应用是有意义的:伺服控制。

如您所知道的,术语“伺服”(伺服电动机短路)通常是指PWM控制的旋转致动器,其使用反馈来精确地控制其输出轴的角位置。控制信号的脉冲宽度对应于角度位置,并且电机基于电流脉冲宽度自动将其轴旋转到适当位置;这是一种简单有效的安排。典型的“业余爱好”伺服组采用标准控制方案,其中1 ms脉冲对应于左侧位置,1.5ms对应于中心,2ms对应于极端右侧。(但是,尽管如此,您将很快看到这些值是“指导方针”;可能需要一些调整。)

伺服规格或缺乏

伺服电我将用于此项目是TowerPro SG92R。Digi-key的SG92R的产品页面指向“数据表“这必须是我读过的最无关的技术文件之一。这是两个页面的总共,第一个完全由照片组成。唯一的实体信息是伺服可以旋转180°。它还提到了标准脉冲宽度与位置关系,其(至少对于我的伺服)证明是高度不准确的。没有电流或电压规格,无扭矩,没有死区宽,没有推荐PWM频率,而且,最糟糕的是,没有引脚。数据表确实可以与Arduino硬件信息结合使用伺服,这对我来说是彻底无用的,因为我不拥有,并且从未使用过任何Arduino产品。

幸运的是,我会提供必要的信息,所以你可以跳过数据表。标称电源电压为5 V,我可以确认5 V工作,因为这就是我正在使用的。One website claims that the acceptable range is 3 V to 7.2 V. I can also confirm that you can successfully drive the control signal with 3.3 V logic, even when the supply voltage is 5 V. I didn’t measure the current, but the servo works fine with a 5 V, 1 A wall-mount transformer. The topic of servo-control PWM frequency is a bit complicated, so I’ll bypass the details; suffice it to say that a good choice is somewhere in the 40 to 60 Hz range. We will use 50 Hz in this project. Finally, here is the pinout:

电机功率

因此,伺服需要5 V.我们有5 v可从SAM4S Xploy Pro获取;为什么与壁挂式变压器打扰?嗯,事实是,通用电机不善于电源。SAM4S板的5 v电源来自USB连接,这不是一个很好的主意,风险通过要求它为电机供电来损坏USB端口。使用像这样的小伺服,你可能会侥幸逃脱,但我需要我所有的USB端口,所以在这种情况下,我会选择安全的抱歉。幸运的是,带来外部电源很方便,特别是如果您使用的是Proto1扩展板。SAM4S板可以由“调试”USB连接器,“SAM4S”USB连接器或外部电源供电。甚至更好,它会自动检测存在哪个电压并相应地为电路板供电。如果存在多于一个电压,它可以根据以下优先级方案选择电源:每当存在时使用外部电源;如果未提供外部电源,并且USB连接都具有可用的总线电源,则板使用“调试”USB电源; “SAM4S” USB power is used only when the other two sources are not active.

因此,我们需要做的就是将壁挂式变压器的引线连接到Proto1板右上角附近的连接器,如下所示:

插入器端子内的弹簧刀片在插入时夹在电线上。只要电线足够严格,这就可以正常工作;如果不是,用一点点焊接涂抹它。每当可用时,SAM4S板将自动使用此外部电源。为了为伺服电动供电,只需将跳线焊接到外部电源总线(标记为“EP5V0”)中的一个通孔,并将跳线的另一端插入伺服连接器的红线端子。

信号和地面

关于其余硬件设置有很多话要说。PROTO1报头上的一个引脚标记为“PWM +”;跳线到伺服连接器的橙色线端子。为地添加跳线,你很高兴。

固件

您需要将三个Atmel软件框架(ASF)模块添加到您的新项目 - 一个用于PWM接口,一个用于USB通信,一个用于ASF延迟功能:

请注意,我们正在使用USB模块的“CDC”版本。这代表了“通信设备类”,这是一个可以在需要基本串行通信的情况下使用的通用类。The ASF’s CDC module makes it surprisingly easy to establish a virtual COM port connection with the PC, and a virtual COM port connection is just what we need—a straightforward interface that allows us to communicate with the PC using a standard terminal program or any other program that includes serial port functionality. We’ll cover the USB portion of this project in the next article.

这是我们将用来确认我们可以正确控制伺服的代码。

的#include的#define PWM0H_SERVO IOPORT_CREATE_PIN(PIOA,23)的#define PWM_CLOCKSOURCE_FREQ百万的#define PWM_FREQ 50的#define PWM_PERIOD_TICKS PWM_CLOCKSOURCE_FREQ / PWM_FREQ的#define PULSE_WIDTH_FULL_LEFT_TICKS 1000的#define PULSE_WIDTH_CENTER_TICKS 1500的#define PULSE_WIDTH_FULL_RIGHT_TICKS 2000 pwm_channel_t PWM0_config;int main(void){//时钟配置和初始化sysclk_init();/ *禁用看门狗定时器和配置/初始化连接到包含在SAM4S Xplated开发平台中的各种组件的端口引脚,例如NAND闪存,OLED接口,LED,SW0 PushButton。* / Board_init();//将外围设备B连接到引脚A23 PIO_CONFIGURUTURE_PIN(PWM0H_SERVO,PIO_TYPE_PIO_PERIPH_B);//为PWM硬件PMC_ENABLE_PLIPH_CLK(ID_PWM)启用外设时钟;//禁用PWM通道,直到正确配置PWM_CHANNEL_DISABLE(PWM,PWM_CHANNEL_0);// pwm clock配置pwm_clock_t pwm_clock_config = {.ul_clka = pwm_clocksource_freq,.ul_clkb = 0,.ul_mck = sysclk_get_cpu_hz()};//应用时钟配置pwm_init(pwm,&pwm_clock_config);//选择通道0 pwm0_config.channel = pwm_channel_0;//选择clock a pwm0_config.ul_prescaler = pwm_cmr_cpre_clka; //active state is logic high PWM0_config.polarity = PWM_HIGH; //left-aligned mode PWM0_config.alignment = PWM_ALIGN_LEFT; PWM0_config.ul_period = PWM_PERIOD_TICKS; PWM0_config.ul_duty = PULSE_WIDTH_CENTER_TICKS; //apply the channel configuration pwm_channel_init(PWM, &PWM0_config); //configuration is complete, so enable the channel pwm_channel_enable(PWM, PWM_CHANNEL_0); while(1) { delay_ms(1000); pwm_channel_update_duty(PWM, &PWM0_config, PULSE_WIDTH_FULL_LEFT_TICKS); delay_ms(1000); pwm_channel_update_duty(PWM, &PWM0_config, PULSE_WIDTH_FULL_RIGHT_TICKS); delay_ms(1000); pwm_channel_update_duty(PWM, &PWM0_config, PULSE_WIDTH_CENTER_TICKS); } }

评论和描述性标识符应允许您了解代码中正在发生的内容。但是,如果您对PWM功能或端口引脚配置有关的内容,请参阅脉冲宽度调制与SAM4S XPLINED PRO了解更多信息。

PWM定时配置由代码开头附近的六个预处理器定义管理:

#define pwm_clocksource_freq 1000000 #define pwm_freq 50 #define pwm_period_ticks pwm_clocksource_freq / pwm_freq #define pulse_width_full_left_ticks 1000 #define pulse_width_center_ticks 1500 #define pulse_width_full_right_ticks 2000

驱动PWM硬件的时钟设置为1 MHz。PWM周期和脉冲宽度以时钟滴答为单位定义,因此我们加载到周期和脉冲宽度寄存器中的任何值对应于微秒中的持续时间。上面显示的值对应于左侧,中心和极右轴位置的标称脉冲宽度:1 ms,1500秒钟的1000个时钟滴答,为1.5 ms,2000个时钟滴答为2毫秒。Infinite同时在主()函数循环的末端循环通过这三个位置,连续更新到脉冲宽度寄存器,由一秒延迟分开。以下视频显示结果:

如您所见,轴的旋转范围无水靠近180°;它看起来更像90°。通过一点试验和错误,我发现以下值产生预期的180°旋转:

#define pulse_width_full_left_ticks 480 #define pulse_width_center_ticks 1440 #define pulse_width_full_right_ticks 2350
         

您可以使用以下链接下载源和项目文件:

servocontrol_via_usb_part1.zip.

结论

我们已设置硬件并实现了一些基本的伺服控制固件。我们还建立了实际将轴移动到极端左,中心和极端右侧的脉冲宽度。在下一篇文章中,我们将包含USB功能,以便我们可以从PC控制伺服。

下一篇文章串联:

为自己提供这个项目!得到bom。

1条评论
  • m
    MJAA. 2016年5月05日

    感谢您的写作和有用的文章。作为高级(读完旧的)嵌入式工程师,我在70年代中期使用Mororola 68xx系列微处理器和外围IC来切割我的牙齿上的牙齿。当本地摩托罗拉重构(字面上)在实验室上串联(字面上)的预生产MC6801微控制器芯片时,我仍然会想到我们在嵌入式架构中举行了Quantum Leap。到一个电网。应用权力,电传兑照片公司与监视程序一起实现。这是我在单个IC上有完整电脑的第一次体验。

    像。 回复