使用Arduino驱动3个菊花链式TLC5951。 是否可以这样做? Arduino MEGA 2560的SPI时钟是否足够快? 是否有可用于实现此目的的示例代码? (我在GitHub中看到了“肢体”代码,但这仅适用于一台设备,该设备有3个菊花链式连接....) 我在链中的第一台设备上尝试了上述代码... 但它只点亮8个LED中的6个? 是否有人可以与我聊天以更好地了解此设备的工作原理?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好,Jason:
随附的是方框图和示意图。
1. 用于红色绿色和蓝色的GSCK全部绑定在一起,并全部链接回Arduino的插针13。 (从肢体示例的针脚9修改)
2. Xblink全部绑定在一起并连接到Arduino的引脚23
3. GSLAT 全部捆绑在一起并连接到Arduino的引脚22
4.所有GSSCK引脚都绑在一起并连接到引脚52 Arduino
5.每个气缸组的所有GSSIN引脚都绑在一起并连接 到引脚51 Arduino。 (7 X数据输入线路驱动7个存储库)
Arduino具有16MHz时钟,SPI总线设置为我们 使用此时钟向LED板发送数据的一半(8MHz)。
我们将数据计时到第1列气缸组的第一个芯片,然后再次发送相同的数据,期望它转移到第1列气缸组的第二个芯片...我们第三次重复此操作,将数据转移到第3列气缸组的芯片中。
我们发送到芯片1的数据似乎工作正常(所有LED指示灯均亮起)。
然后,我们再次发送相同的数据,希望看到相同的数据被转移到芯片2。我们看到芯片1的所有LED照亮是预期的。 但 芯片#2并未始终照亮所有LED。我们再次这样做,并期望数据通过芯片#3移动...但我们看到相同的问题...似乎有些数据没有正确地通过移动。第一个芯片#1始终是 正确,但从这一步切换至2和3的后续步骤似乎不能正常工作。
我们看到气缸组2等出现类似问题。每个气缸组的第一个芯片获得正确的数据并点亮所有LED,但后续切换至芯片2和3并不总是点亮所有LED。
有时换档工作正常,但有时芯片2和3上的某些LED不亮。
这是我们修改的代码,用于转移到下一个芯片并点亮所有的存储库
// GSSCK和GSSIN分别连接到SPI时钟和MOSI引脚
// GSLAT位于引脚22上,XBLNK至23
//绿色,红色和蓝色的所有灰度时钟(GSCKG,GSCKR,GSCKB)
//连接到相同的Arduino引脚(9)
//----------------
包含"TLC5951.h"
#include <SPI.h>
#define GSLAT 22.
#define XBLNK 23.
#define GSCKGRB 13.
#define start_color "红色"
TLC5951 tlc;
void setup(){
//将计时器设置为最大速度以生成最快的PWM
//这是必需的,以便TLC5951上的灰度时钟速度足够快,可以防止LED中出现可见抖动
//当前值适用于Arduino Mega 2560
//链接以查找您的Arduino的值: fard.Arduino .cc/.../TimerPWMC散热片
TCCR0B = TCCR0B和0b11.1万 | 0x01;//引脚9和10 @ 3.125万 Hz
//现在将GSCKGRB设置为输出和50 % PWM占空比
//为了简单起见,所有三个灰度时钟都绑定到同一个引脚上
PinMode (GSCKGRB,输出);
类比书写(GSCKGRB, 127);
//库不会为您创建SPI,以防止其他SPI库出现问题
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV2);
// init (GSLAT引脚,XBLNK引脚,所有LED的默认灰度值)
tlc.init(GSLAT,XBLNK,0);
// setled (输出编号,红色值,绿色值,蓝色值)
//后面的行将所有LED设置为最亮的蓝色设置(0-4095)
// tlc.setLED(0,0,04095);
// tlc.setLED(1,0,04095);
// tlc.setLED(2,0,04095);
// tlc.setLED(3,0,04095);
// tlc.setLED(4,0,04095);
// tlc.setLED(5,0,04095);
// tlc.setLED(6,0,04095);
// tlc.setLED(7,0,04095);
//我们必须设置网点校正值,因此将它们全部设置为最亮的调整
tlc.setAllDCData(127);
//设置功能控制数据锁存值。 有关此闩锁的用途,请参阅TLC5951数据表。
//数据首先是输入LSB,即位192 (用于红色DC范围)首先是1
//位198 (0)是最后一个,用于灰度计数器模式
tlc.setFunctionData(B111.11万);
Serial.begin(11.52万);
对于(int i = 0;i <= 7;I++){
tlc.setLED(i,0,0,0);
//Serial.println (i);
}
//将所有亮度级别设置为最大值(127)
TLC.update();
延迟(10万次);
对于(int i = 0;i <= 7;I++){
tlc.setLED(i,4095,4095,4095);</s>4095 4095
serial.println (i);
}
//最后,调用函数将数据发送到TLC5951
// tlc.update();
//蓝色,x红色
tlc.setBrightness(8,0,0);
TLC.update();
延迟(10万次);
tlc.setBrightness(0,8,0);
TLC.update();
延迟(10万次);
tlc.setBrightness(0,0,8);
TLC.update();
感谢您的回复,
我们正在通过GSSIN引脚将功能控制数据发送到设备。 据我所知 ,这样做是可能的。
我们正在格式化 功能控制数据(216位),并将其发送到设备 (通过GSSIN引脚),然后格式化GSdata (288位),然后将其发送到 (通过GSSIN引脚),通过时钟指示器引脚锁定每个。
但是我认为我们的问题是,因为我们有3个设备是以菊花链方式连接的,我们最初发送控制数据,然后将设备数据发送到第一个设备,锁定它,然后对第二个设备执行完全相同的操作,锁定它,然后对第三个设备执行相同的操作。
我们应该做的是格式化所有 控制数据(648位),将其发送到3个设备,然后格式化 GSdata (864位)并将其发送到3个设备..这样做现在似乎工作正常。
这是否合理?
此致