注释
@Harms2019: 是的,拥有它会很不错。然而,如果你没有注意到,最新的固件将 328p 的闪存和内存完全打包到最大。必须省略小的用户友好改进(仍然可以通过 config.h 和重新编译进行更改)。不过别担心,其中大部分将在下一个主要版本(很快)中解决。 |
降低波特率以尝试修复干扰就像在断腿上贴创可贴一样 |
这并不正确,因为损坏的 LED 可能是错误的波特率。这是 16Mhz osc 的值和错误。谐振器增加了另一个 +-1.1% 的误差,xtal 在这些数字之上增加了 +-0.15% 的误差。9 位传输要求工业应用 +-1.5% 精度,商业应用允许 +-3%,对于 CNC,我倾向于使用工业规则。此计算包括超过 10 年的老化等,如温度误差。如您所见,28.8k 57,6k 和 115,2k 不允许可靠运行。但其他波特率满足允许的错误,如果使用 xtal,则允许 28.8。 9600 14400 19200 28800 103 0.2% 68 0.6% 51 0.2% 34 -0.8% 38400 57600 76800 115200 25 0.2% 16 2.12% -8% 12 % 250K, 500K, 1M, 和 2M 是可选的,支持取决于 USB 设备是否可以自然地处理波特率和错误。例如,一些设备只能以 2.1% 的误差处理 1Mbaud,并且考虑到商业 3% 的误差范围,这表明即使误差超出工业应用的范围也支持。2019-07-16 19:12 GMT+02:00,langwadt <notifications@github.com>:
|
如果您将 Arduino Uno 与 Atmega16u2 USB 转串行设备一起使用,则两个微控制器都以相同的方式从 16Mhz 振荡器(可能来自同一批次)生成波特率时钟,在相同的电压和大致相同的温度下运行,因此它们之间的相对误差应该远小于数据表中给出的绝对误差。 |
即便如此,细节仍是罪恶所在。UNO R3 使用 8mhz xtal,主处理器 16mhz 谐振器。atmega 16u2 在 115.2k 时有 -3.5% 的波特率误差,而 grbl 有 +2.1% 的误差。总误差为 5.6%。如果 grbl 以不同方式配置串行,则总体错误为 0,就好像不使用 U2X0 标志一样,它存档 -3.5% 波特错误而不是 +2.1%,始终参考 115.2k 串行速度。在这种情况下降低速度是解决此问题的一种可能性。如果您考虑其他误差因素并且保证金最小,Rs232 可能会达到 +-6% 或 5.5% 或 5%。然而,在这种情况下,每一个最小的噪声/电磁干扰都可能导致错误接收,因为来自 16 倍过采样的 8 位是错误的(5.5% 及以上)。它之所以起作用,是因为没有奇偶校验位和停止位都为 0 电平。还有其他具有真正 usb2rs232 芯片的 uno。
|
好吧,正如已经说过的那样,细节决定成败。另一个小问题是大多数波特率计算使用很好的整数值,如 300、600、1200、2400、4800 和 9600 波特。但是,如果使用 8 甚至 16 Mhz xtal,所需的波特率越高,生成正确的波特率就越困难。计算捕获带宽时,必须考虑实际波特率值,例如 FT232R、FT2232 和 FT232 在理论现实中的 19230、38461、57692、115384、230769、461538 和 923076 波特。记住; 这种不匹配是在 Arduino 方面。不清楚的是在 PC 端生成的波特率不匹配,其中 RS232 信号被封装在 USB 数据包中。仔细考虑(尤其是 2 米或更长的距离), |
你确定吗?我以为 Uno 上的两个微控制器的时钟频率都是 16Mhz。这似乎是官方 Arduino 原理图显示的内容。由于它们都是具有相同类型串行外围设备的 AVR,即使波特率发生器存在百分之几的理论误差,两个设备也应该具有完全相同的误差。 |
串行传输(技术上不是 RS232,因为它发生在 5V 逻辑电平)仅发生在安装在 PCB 上相距约一英寸的两个芯片之间。链接的 USB 端与波特率设置无关。您是否有证据表明 Arduino 上两个芯片之间的连接导致数据损坏?如果是这样,您是否有机会在 CNC 旁边进行电弧焊? |
是的,两个版本都存在,带有 smd 328 的较新版本有 8Mhy Xtal。在内部,两者都使用 8Mhz clk(即使 F_CPU 设置为 16MHz)。16Mhz 的版本启用了 div2 时钟分频器。在 115.2K 上,它使用 U2X0,因此它实际上与 16Mhz 相同,但清除了 U2X0。该速度下的 Grbl 始终使用 U2X0 集。这是 5.6% 的差异。停止位从 ust 开始到 75390 ns 的 uC,uC 在 79766 ns 识别相同的边沿。一位是 8681 ns。这是错误的一半以上。对于传输的最后一位,它从 67013 ns 开始到 75390 ns 结束。相反,接收器读取它从 70903 ns 开始到 79766 ns 结束。这意味着在假定的 16 倍过采样的 8 位上,有效位模式是 16 个样本中的 8 个。一个电磁干扰/噪声尖峰,数据已损坏。翻转形式 0 到 1 受到保护,但是从位 1 翻转到 0 是很有可能的。由于 LSB 首先发送,而 MSB 通常始终为零,因此需要一个或多个 2.2uS 长的尖峰或接地环路问题。这意味着它应该可以工作,但在使用低速或另一个 arduino 板或不使用 2x 倍频器时不稳定。但是不要指望该解决方案可以工作 10-15 年,7 年后谐振器的老化已经改变了它肯定不再工作的时间。2019-07-18 16:16 GMT+02:00,Alex Holden <notifications@github.com>:但是不要指望该解决方案可以工作 10-15 年,7 年后谐振器的老化已经改变了它肯定不再工作的时间。2019-07-18 16:16 GMT+02:00,Alex Holden <notifications@github.com>:但是不要指望该解决方案可以工作 10-15 年,7 年后谐振器的老化已经改变了它肯定不再工作的时间。2019-07-18 16:16 GMT+02:00,Alex Holden <notifications@github.com>:
|
好吧,抱歉大家把球棒扔进了鸡舍。 Arduino 处理器和 USBtoRS232 之间的通信对我来说似乎不是瓶颈。但是,如果 Arduino 设置为 115200 波特,则 FT232R 芯片的实际值为 115384 波特。然而,许多人并没有意识到 USB 实际上是“下一代串行 RS232”,并且有其自身的设计缺陷。 现代 PC 比 Arduino 的 8 或 16 Mhz 基频快得多。PC 上的 grbl GUI 使用 RS232 终端应用程序,应该设置为与 Arduino 相同的速度。如果在 PC 端,RS232 信号是完全基于 115200 波特的软件构建,则存在 184 波特的不匹配。这个最终不匹配的 RS232 信号(-一个字母-)被移交给 RS232toUSB 应用程序,该应用程序将软件信号“封装”在几个后续的 USB 数据包中。此操作系统依赖的 USB 应用程序(“设备”)是连接到 USB 主机芯片(EHCI、UHCI 等)的操作系统独立的软件和硬件,它被视为 127 个可能的 USB 网络客户端之一。当 USB 主机发现它适合时,它会将封装的信号包发送到 USB 客户端“Arduino”(或“CH340” 或“ACM0”或使用的任何名称),USBtoRS232 芯片将提取软件数据包并将其内容重建为电压硬件信号。FT内置UART的Rx-和Tx-shiftregister可以处理一定量的失配;称为捕获带宽(有关更多信息,请参阅 FT232 扩展数据表。)。假设 PC 的 Tx 和 Arduino 的 Rx 在完全相同的百分比小带宽内工作;只要 Rx 在低侧捕捉到,而“Tx 发送”在高侧,通信就会启动并运行。如果模态 Tx 和/或 Rx 基频之一或两者发生偏移(通常由干扰或噪声的副作用(尖峰)引起),通信就会丢失。在完美的世界中,计算(如前所述)将给出答案。 那是一部分。另一个问题是 USB 的硬连线 T 网络本身。为了跟踪所有连接的 USB 客户端设备,USB 主机会定期暂停正在进行的数据包发送,以检查哪些 USB 设备在线;此功能使 USB 可以“热插拔”(但也会中断正在运行的通信)。随着“接收波特率”的每次增加,允许的“检查设备中断”时间越短。同一个 USB Host 上连接的 USB 设备越多,有效数据包速度就越低。由于允许 127 个设备;为什么我的电脑有 7 个不同的 USB 主机芯片?为什么会这样?许多 Arduino IDE 用户遇到的“不同步错误”,通常可以通过断开所有 USB 设备(使用有线键盘和鼠标)来解决,并在每个可用的 USB 端口测试上传到 Arduino。在计算的实验室条件下,所有这些 USB 主机电路条件应该相同;在现实世界中,事实证明这根本不是真的。 在 USB 端,Arduino 将自己标识为“USB 1.01 Class 2”,这意味着主机-客户端技术是一种主从协议。FT232 不可能自己发送“数据请求”。由于无法以任何方式访问通信中断,Arduino 可能很容易“超时”。因此,将最好的 USB Host 保存为 Arduino 的单个主机。 最后但并非最不重要的; 一个非常不愉快的未被怀疑的侏儒是“节能”。某些 3D 打印机作业可能需要 13 个小时以上才能完成。对于这样的加工持续时间,110 波特的波特率就可以了。9600 波特的通用整体波特率对于几乎所有 CNC 机器来说都足够快了。为什么要将默认波特率从 9600 加速到 115200?想象一下,这就像骑自行车从 9.6 km/h 加速到 115 km/h。引用阿姆斯特朗先生的话“……不是一小步,而是一大步……”。为避免不必要的中断,人们往往会在开始 CNC 作业后让 PC 保持原样。如果 PC 的节能没有关闭,那么过一段时间就会切换到节能模式,这可能会导致 PC 和 USB 速度下降,甚至进入暂停休眠(深度睡眠)。 回到这开始的地方。… 为了避免吸入二恶英而中毒或死亡,我不得不将激光切割机放在更(对我而言)更健康的位置。我不得不使用三根 2 米长的 USB 电缆。是的,这是自找麻烦,很快就经常通讯中断了。很快就发现了原因并实施了解决方案。解决我的问题时,我注意到与以前的 grbl 版本相比波特率大大提高,并且只需更改波特率值就必须付出巨大的努力。在互联网上四处张望、搜索和查探,我发现许多 grbl 和 Arduino 用户都存在沟通问题,并且正在努力修复它。“我们已经测试了这个设置,没有发现任何问题”。当然,一级方程式赛车在一级方程式赛道上创造了巨大的速度记录。然而,在现实世界中,人们往往不生活在赛道上,而是生活在崎岖不平的坑坑洼洼的小路上。如果报童试图通过使用一级方程式赛车来提高送货速度,那么,这取决于他。但不要因为汽车卡住、抛锚或撞墙而来找我。“我只想要我的日报;不多也不少”。 Thinking it all over, I made the suggestion to the grbl team to add a new $B parameter as baudrate-settings and chancing init’s Serial.Begin([baudrate]) into Serial.Begin($B) . Every grbl-user can simply change the grbl’s baudrate very easy if necessary. To prevent losing contact by entering invalid values, I also added a small checking routine. No big deal. Thats all folks! P.S. If I break my leg and bones are sticking out of the skin, I prefer a bandaid as soon as possible to prevent future amputation. |
The arduino on GRBL source code send/read at 117647 BAUD, the FT232R chip at 115385 baud (3000000/26) The error is 2%, this is ok. For longer cable, use usb to ttl converter and rs422 , example SN75176 for driver and receiver and network cable or twisted cable. In case with lm324 you could construct such a driver if price or deliver time is a problem. On network cable you can deliver the power too if you need that. I had done something similar, default is 19200, on 16Mhz, 9600 on 8Mhz 1200 on 1Mhz and 24400 on 20Mhz ., but i have stored it on separate config system memory. inside eeprom that defines some configurations using 3 bits. . I have implemented 19200 38400 57600 for 20Mhz I have implemented 19200 38400 57600 2000000 for 16Mhz I have implemented 9600 19200 28800 for 8Mhz (internal osc) I have implemented 1200 2400 19200 for 1Mhz (internal osc) #define F_CPU 16000000 static void uart_0(void) { #define BAUD 19200 #include <util/setbaud.h> UBRRH = UBRRH_VALUE; UBRRL = UBRRL_VALUE; #if USE_2X UCSRA |= (1 << U2X); #else UCSRA &= ~(1 << U2X); #endif } static void uart_1(void) { #undef BAUD // avoid compiler warning #define BAUD 38400 #include <util/setbaud.h> UBRRH = UBRRH_VALUE; UBRRL = UBRRL_VALUE; #if USE_2X UCSRA |= (1 << U2X); #else UCSRA &= ~(1 << U2X); #endif } static void uart_2(void) { #undef BAUD // avoid compiler warning #define BAUD 57600 #include <util/setbaud.h> UBRRH = UBRRH_VALUE; UBRRL = UBRRL_VALUE; #if USE_2X UCSRA |= (1 << U2X); #else UCSRA &= ~(1 << U2X); #endif } static void uart_3(void) { #undef BAUD // avoid compiler warning #define BAUD 2000000 #include <util/setbaud.h> UBRRH = UBRRH_VALUE; UBRRL = UBRRL_VALUE; #if USE_2X UCSRA |= (1 << U2X); #else UCSRA &= ~(1 << U2X); #endif } #define F_CPU 20000000 static void uart_4(void) { #define BAUD 19200 #include <util/setbaud.h> UBRRH = UBRRH_VALUE; UBRRL = UBRRL_VALUE; #if USE_2X UCSRA |= (1 << U2X); #else UCSRA &= ~(1 << U2X); #endif } static void uart_5(void) { #undef BAUD // avoid compiler warning #define BAUD 38400 #include <util/setbaud.h> UBRRH = UBRRH_VALUE; UBRRL = UBRRL_VALUE; #if USE_2X UCSRA |= (1 << U2X); #else UCSRA &= ~(1 << U2X); #endif } static void uart_6(void) { #undef BAUD // avoid compiler warning #define BAUD 57600 #include <util/setbaud.h> UBRRH = UBRRH_VALUE; UBRRL = UBRRL_VALUE; #if USE_2X UCSRA |= (1 << U2X); #else UCSRA &= ~(1 << U2X); #endif } static void uart_7(void) { #define F_CPU 1000000 #undef BAUD // avoid compiler warning #define BAUD 19200 #include <util/setbaud.h> UBRRH = UBRRH_VALUE; UBRRL = UBRRL_VALUE; #if USE_2X UCSRA |= (1 << U2X); #else UCSRA &= ~(1 << U2X); #endif } void serial_ini(char i) { if(!i–) uart_0(); if(!i–) uart_1(); if(!i–) uart_2(); if(!i–) uart_3(); if(!i–) uart_4(); if(!i–) uart_5(); if(!i–) uart_6(); if(!i–) uart_7(); // enable rx and tx UCSR0B |= 1<<RXEN0; UCSR0B |= 1<<TXEN0; // enable interrupt on complete reception of a byte UCSR0B |= 1<<RXCIE0; // defaults to 8-bit, no parity, 1 stop bit } void serial_init() { serial_ini(eeprom_ver()&7); } 2019-07-19 17:07 GMT+02:00, Harms2019 <notifications@github.com>:
|
修复串行通信。
大家好,
曾几何时,当我还是一名年轻的电子学生时,在110波特的波特率提高到令人生畏的9600波特的时代,我们曾经自己组装和维修RS232串口设备。在没有任何内部和外部知识的情况下,这几乎是不可能完成的任务。串行通信中最不可捕捉的部分是噪音和干扰,由邻居的厨房机器、湿度、静电和闪电等条件、家庭成员使用电灯开关等引起。没有这些因素,世界将是完美的。随着时间的推移,串行通信从 RS232 改进为 16 Gbits/秒的 USB 3.2。然而,……串行通信的不可捕获部分并没有宣布自己已经过时,但仍然在那里破坏了聚会。
由于grbl使用默认波特率115.200波特,一旦通信突然中断,停止,自杀,许多grbl用户感到困惑;“我做错什么了?”。
首先; 第一部分是“信号屏蔽”。对于制造商;通过适当的屏蔽防止噪声和干扰甚至到达信号线。这适用于所有信号线;开关、末端开关、每个输入信号(包括零伏线)都必须屏蔽,并且中央“星形接线”连接到一个“信号接地”。打开的 PC 机壳不再屏蔽信号噪音。开放式有线电子网络作为 CNC 机器旁边桌子上的设备通常与构建“噪声天线”相同。
第二部分是生活本身。世界并不完美,狗屎总会发生。噪音确实经常破坏聚会。有时有点翻滚。在串行通信中,RX 移位寄存器有时来不及捕捉到信号上升。USB 电缆太长,开始出现干扰“信号回波”。PC 上使用的 USB 端口速度太慢或噪音太大(尝试另一个)。USB 电缆没有充分屏蔽(尝试另一根)。串行通信中断的原因有很多。grbl 新手起初对电缆类型感到困惑;“我使用的是 USB,不是 RS232!”。然而,Arduino 的处理器确实使用老式的 RS232。因此在Arduino中增加了一个特殊的USB转串口芯片,用于使用USB作为包络发送RS232信号。
设置 RS232 最佳波特率是第三部分。在工业环境中,只要测试当前通信速度正常,通常的做法是手动将波特率提高到下一个设置。在波特率设置为高的那一刻,通信中断,所以以前的波特率是最优的。这种加速-切换-减速技术是通过设计嵌入到 USB 协议本身中的,并保证向下兼容性和尽可能高的速度设置;可以在 USB 3.0 端口上使用 USB 1.0 设备,反之亦然。
默认情况下,出于模拟实时加工的原因,grbl 将 RS232 通信的最小波特率设置为 115.200 波特(请记住,模拟实时根本不是真正的实时!)。在嘈杂或干扰严重的环境中,此默认速度可能非常高。每当串行通信经常发生故障时,建议降低 grbl 的波特率。不幸的是,没有简单的方法可以实现这一点。
Arduino IDE 软件工程师下载 grbl 源代码,打开 config.h,找到波特率设置,将其更改为新的波特率值,编译并将修改后的 grbl 软件上传到 CNC 机器的 Arduino。
对于普通的 3D 打印机/激光切割机爱好者来说,这不是一项简单的任务。
功能要求。
在以前的时代,串行设备曾经有一个波特率选择器开关。改变波特率是一个简单的旋转旋钮,任何人都可以做到。仔细考虑;为什么不使用像 $B 这样的新 grbl $ 变量来设置 Arduino 的 FT232R 芯片的波特率?Bij 更改 $B 值并重新启动,每个人都可以简单地更改、测试和修复 RS232 通信设置。
我的 Arduino IDE 经验有限,$B 功能实际上应该包含在 grbl 本身中。下面的测试示例给出了如何防止 $B 出现奇数或错误值,以及如何设计软件波特率选择器的想法。
grbl_baud-proposal.pdf