跳到主要内容

一个- cm - 280伺服信号分离器

内容

术语和定义

ASIC.应用特定集成电路
asm.异步状态机
CPLD.复杂可编程逻辑器件
ics.集成电路
单片机微控制器

参考文献

有关文件及软件,请浏览:

https://www.dialog-seminile.com/configurable-mixed-signal.

下载我们的免费GreenPak Designer软件以打开.gp文件并查看所提出的电路设计。在几分钟内使用GreenPak开发工具将设计冻结到您自己的定制IC中。yabo国际娱乐对话框半导体提供一个完整的应用程序注释库,其中包含了设计示例,以及对话框IC中的功能和块的说明。

  1. GreenPak设计师软件,软件下载和用户指南,对话框半导体yabo国际娱乐
  2. AN-CM-280伺服拆卸器.GP,GreenPak设计文件,对话半导体yabo国际娱乐
  3. GreenPak开发工具,GreenPak开发工具网页,对话半导体yabo国际娱乐
  4. GreenPak应用笔记,绿派克应用笔记网页,对话半导体yabo国际娱乐

介绍

伺服电机广泛应用于商业和工业应用的线性或旋转驱动器。亚博国际官网平台网址本例采用SG90型号,成本低,耗电少,重量轻。这使这些类型的伺服理想的消费设备遥控玩具,如rf控制赛车,飞机,和其他。

然而,为了正确地控制伺服电机,电子驱动器必须对伺服电机数据引脚产生适当的电压模式。波形应该是小于2毫秒的脉冲,每个伺服电机每20毫秒重复一次。

本申请说明将使用SLG46537V GreenPak™IC提供1至8个伺服电机信号解复用器的设计。设计的信号多路分解器将在8个输出引脚上驱动8个伺服电机,其中多路复用信号进入1个输入引脚。根据系统要求,SLG46537V还可以集成附加功能,例如附加逻辑或电压监控。

以下部分将展示:

  • 伺服电机1 RF通道信号多路复用;
  • 详细设计了SLG46537V GreenPAK伺服解复用器;
  • 如何使用1 GreenPak设备驱动8个伺服电机。
图1:SG90型伺服电机

伺服电机1 RF通道复用

小型9g伺服电机的标准是运行0.5 ms ~ 1.5 ms HIGH脉冲,周期为20毫秒。0.5 ms与0°相关,1 ms与90°相关,1.5 ms与180°相关。

这样,如果我们为每个电机脉冲保留一个2毫秒的窗口,8毫秒x 2毫秒可以用于8个电机脉冲窗口,其余的4毫秒沉默用于同步。图2显示了8个电机20毫秒的时间多路周期,均在90°位置(1毫秒脉冲)。图3显示了8个电机20毫秒的时间多路周期,除5号电机在0°位置(0.5毫秒脉冲)外,其余均在90°位置(1毫秒脉冲)。

图2和图3是由Python脚本生成的符号数字样本的波形,以实现50,000 Hz的采样率。

图2:时间多路复用 - 8x 90°@ 50ks / s
图3:时间复用- 7x 90°,#5 =0°@ 50kS/s

GreenPak设计原理图

GreenPak设计的原理图如图4所示。设计的基本块是内部振荡器,2x计数器,2倍过滤器,8倍触发器,带有复位的ASM,带有OE和下拉的8倍引脚,输入引脚和供应销。

图4:GreenPAK设计方案的俯视图

GreenPAK计时模块

采用OSC0内部振荡器。驱动CNT2计数器2mhz /8/64≈3.9 kHz和CNT4计数器2mhz /8/4≈62.5 kHz。设置如图5所示。CNT2设置为在所有下降边(延迟模式)上重复触发,并在4.096 ms后给予非倒向OUT。这是在20毫秒时间多路复用周期结束时的4毫秒静音检测,它将ASM重置为状态0。CNT4被设置为在96 μs后每个下降沿触发一次(一次触发模式),给所有触发器时钟输入一个短脉冲。只有当前状态的触发器有一个高输入,将触发ASM过渡到以下状态。

图5:时间块设置的特写

GreenPak ASM

GreenPak设计中的触发器用于将异步状态机更改为同步机。如上一节所述,CNT / DLY4将短脉冲传递到所有触发器时钟输入,但只有当前状态的触发器具有高输入,并将触发到状态+1的过渡。由于所有其他折叠都刚刚加载了低输入,因此阻止了ASM失控,因为所有其他折叠刚加载,因此ASM必须等到下一个转换的下一个脉冲。这是必要的,因为所有州过渡条件都是相同的1条件。设置如图6所示。

图6:ASM设置的关闭视图

GreenPAK设计引出线

信号输入IO0配置为无施密特触发器的数字输入。ServoX DATA输出配置为在OE = 1时的1x推挽,在OE = 0时,它们是带有10k下拉电阻的输入。Pinout如图1和图7所示。

表1:设计Pinout
图7:引脚配置 - STQFN20L

测试结果

信号输入由由Python脚本(附录a)生成的音频输出信号(0 ~ 5v)放大驱动。图8显示信号输入(黄色)和Servo1数据输出(蓝色)。生成的。wav文件包含20秒精心设计的伺服动作,GreenPAK设计据此解码所有8个伺服电机动作所看到的ServoX DATA信号。

图8:输入/输出 - 测量

结论与结果

提出了模型伺服电机解复用器的设计。通过使用SLG46537V的GreenPak设计,我们已成功实现了轻量级,低功耗,经济高效的解决方案。图9显示了SLG46537V的资源使用。该设计成功地解码了所有8个伺服电源数据信号,从一个时间复用信号输入 - 图10。

图9:SLG46537V使用的资源
图10:逻辑分析仪 - 所有信号

附录A源代码

#servomux.py ###############################################################开始#

进口波

将numpy导入为np

导入matplotlib.pyplot作为plt

def repeat48x(系列):

返回np。系列,系列,系列,系列,系列,系列,系列,系列,系列,系列series, series, series, series, series, series, series),轴=None)

Silence = -NP.ONES(200)

pulse10 = np.concatenate((np.ones(50),-np.ones(50)),轴=无)

plt.plot (pulse10)

plt。ylabel(脉冲1.0毫秒)

plt.show ()

pulse05 = np.concatenate ((np.ones (25), -np.ones(75)),轴=没有)

plt.plot(pulse05)

Plt.ylabel('脉冲0.5ms')

plt.show ()

pulse15 = np.concatenate ((np.ones (75), -np.ones(25),轴=没有)

plt.plot(pulse15)

plt.ylabel('脉冲1.5ms')

plt.show ()

# second10

系列= np。concatenate((pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, si- lence), axis=None)

plt.plot(系列)

plt。Ylabel ('20ms系列8x 1.0ms +沉默')

plt.show ()

second10 = repeat48x(系列)

plt.plot (second10)

plt。Ylabel ('1s- 20ms系列8x 1.0ms +沉默')

plt.show ()

# second1L

系列= NP.CONCATENATE((PUSSOR05,PULSE10,PULSE10,PULSE10,PULSE10,PULSE10,PULSE10,PULSE10,SI- LENCE),轴=无)

plt.plot(系列)

Plt.ylabel('1L- 20ms系列8x 1.0ms +沉默')

plt.show ()

second1L = repeat48x(系列)

plt.plot(stign1l)

Plt.ylabel('1L-1S-20ms系列8x 1.0ms +沉默')

plt.show ()

# second2L

系列= np。concatenate((pulse10, pulse05, pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, si- lence), axis=None)

plt.plot(系列)

plt。ylabel('2L- 20ms系列8x 1.0ms +沉默')

plt.show ()

second2L = repeat48x(系列)

plt.plot (second2L)

plt。ylabel('2L-1s- 20ms系列8x 1.0ms +silence')

plt.show ()

#second3l.

系列= np。concatenate((pulse10, pulse10, pulse05, pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, si- lence), axis=None)

plt.plot(系列)

Plt.ylabel('3L- 20ms系列8x 1.0ms +沉默')

plt.show ()

second3L = repeat48x(系列)

plt.plot(second3l)

plt。ylabel('3L-1s- 20ms系列8x 1.0ms +silence')

plt.show ()

#exply4l.

系列= NP.CONCATENATE((PULSE10,PULSE10,PULSE10,PULSE05,PULSE10,PULSE10,PULSE10,PULSE10,SI-LENCE),轴=无)

plt.plot(系列)

Plt.ylabel('4L- 20ms系列8x 1.0ms + Silence')

plt.show ()

second4L = repeat48x(系列)

plt.plot (second4L)

Plt.ylabel('4L-1S-20ms系列8x 1.0ms +沉默')

plt.show ()

#exply5l.

系列= NP.CONCATENATE((PULSE10,PULSE10,PULSE10,PULSE10,PULSE05,PULSE10,PULSE10,PULSE10,SI-LENCE),轴=无)

plt.plot(系列)

Plt.ylabel('5L- 20ms系列8x 1.0ms +沉默')

plt.show ()

second5L = repeat48x(系列)

plt.plot (second5L)

plt。ylabel('5L-1s- 20ms系列8x 1.0ms +silence')

plt.show ()

# second6L

系列= np。concatenate((pulse10, pulse10, pulse10, pulse10, pulse05, pulse10, pulse10, si- lence), axis=None)

plt.plot(系列)

plt。ylabel('6L- 20ms系列8x 1.0ms +沉默')

plt.show ()

second6L = repeat48x(系列)

plt.plot (second6L)

plt。ylabel('6L-1s- 20ms系列8x 1.0ms +silence')

plt.show ()

#exper7l.

系列= np。concatenate((pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, pulse05, pulse10, silence), axis=None)

plt.plot(系列)

Plt.ylabel('7L- 20ms系列8x 1.0ms +沉默')

plt.show ()

second7l =重复48x(系列)

plt.plot (second7L)

plt。ylabel('7L-1s- 20ms系列8x 1.0ms +silence')

plt.show ()

#yemp8L.

系列= np。concatenate((pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, pulse10, pulse05, silence), axis=None)

plt.plot(系列)

plt。ylabel('8L- 20ms系列8x 1.0ms +沉默')

plt.show ()

second8L = repeat48x(系列)

plt.plot(second8l)

plt。ylabel('8L-1s- 20ms系列8x 1.0ms +silence')

plt.show ()

w = wave.open(“servo.wav”,“世界银行”)
W.SetNchannels(1)
W.setsampwidth(1)
W.SetFramerate(48000)
# w.setnframes (24000)
# w。setcomptype('没有',' wav”)
w.writeframesraw(100 * second10.astype(np.int8))
w.writeframesraw(100 * second10.astype(np.int8))
w.writeframesraw(100 * second10.astype(np.int8))
w.writeframesraw(100 * second10.astype(np.int8))
w.writeframesraw (100 * second1L.astype (np.int8))
w.writeframesraw (100 * second2L.astype (np.int8))
w.writeframesraw(100 * second3l.astype(np.int8))
w.writeframesraw (100 * second4L.astype (np.int8))
w.writeframesraw(100 * second5l.astype(np.int8))
w.writeframesraw(100 * second6l.astype(np.int8))
w.writeframesraw(100 * second7l.astype(np.int8))
w.writeframesraw(100 * second8l.astype(np.int8))
w.writeframesraw(100 * second10.astype(np.int8))
w.writeframesraw(100 * second10.astype(np.int8))
w.writeframesraw(100 * second10.astype(np.int8))
w.writeframesraw(100 * second10.astype(np.int8))
w.close ()

# servoMUX.py ##################################################################### #结束