Main Menu
Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - i2k

#17
ควรจะต้องมี lowpass filter ด้วยนะครับ http://www.enide.net/webcms/?page=pcm2pwm
#18
ผมก็เจอแบบนี้เหมือนกันใน Arduino และแก้ด้วยวิธีนีก็ใช้ได้ ลองเพิ่มขนาด buffer ให้ใหญ่ขึ้นอีก

ก็มีวิธีอื่นคือเอาเลข floating point มาคูณด้วย 10^n ให้ได้เป็นเลขจำนวนเต็มก่อน ลองไปดูตามตัวอย่างนี http://stackoverflow.com/questions/905928/using-floats-with-sprintf-in-embedded-c แต่ดูแล้วมันจะยุ่งเกินไป

ปัญหาเกิดจาก sprintf() จะต้องเลือก linker options ให้ถูกต้องถึงจะใช้ได้ ทั้ง avr studio กับ codevision ผมไม่เคยใช้ คงต้องรอท่านอื่นมาช่วยละครับ
#19
ใช้ dtostrf() แทน sprintf() http://www.atmel.com/webdoc/AVRLibcReferenceManual/ch20s10s02.html
ตัวอย่าง:

#include <stdlib.h>   

float processvalue = -12.3;
char buffer [6];
dtostrf(processvalue,5,1,buffer);    // {-}dd.d

////Serial.println(buffer);
//lcd.setCursor(0, 0);
//lcd.print(buffer);
#20
เมือบอกค่าสูงสุดมาก็สามารถทำให้ผิดพลาดน้อยลงได้อีก ลองsimulate ดูว่าจะช้าลงอีกเท่าไร

b = (a/8) + (a/256) + (a/1024) + (a/8192) ;

5678 ได้ 736 ใกล้ขึ้นมาหน่อยแล้วนะครับ
อีกตัวอย่าง 1000 x 0.13 ควรจะได้ 130 แต่ได้ 128 !!! ค่าที่ผิดไปเกิดจากการปัดเศษในการหารทิ้งไป

วิธีแแบบนี้ใช้ได้กับทุกค่า แต่ต้องเป็นค่าคงที่ เพียงแต่หาค่าสัมประสิทธิ์ที่ถูกต้อง

ท่านไม่ได้บอกว่าจะเอาผลที่ได้ไปทำอะไร แล้วโมดูล i/o ที่กล่าวถึงสื่อสารด้วยวิธีอะไร เร็วขนาดไหน ผมก็อยากรู้ว่าทำไมต้อง0.13ด้วย ถ้าเป็นโมดูลที่เกี่ยวกับสัญญาณ Analog ก็สามารถรับค่าผิดพลาดขนาดนี้ได้

เลือกระหว่างความเร็วกับความแม่นยำ หรือเปลี่ยนไปใช้ตัวที่ดีกว่าซึ่งอาจจะยังไม่มีความชำนาญในการใช้งาน ได้อย่างเสียอย่าง อยากได้ของดีต้องจ่ายเพิ่มครับ
#21
MCU ใช้ระบบตัวเลขฐานสอง (Binary)จึงไม่มีค่าที่พอดีเป๊ะกับตัวเลขฐานสิบ  สำหรับค่าที่ยกมา 0.13 ค่าใกล้เคียงคือ (1/8) + (1/256)  = 0.12890625

ถ้า a เป็นตัวเลขที่จะคูณ b คือผลลัพธ์

   b = (a/8) + (a/256);

ถ้าอยากให้ผิดพลาดน้อยลง แต่ก็ช้าลงด้วย  , (1/8) + (1/256) + (1/512) = 0.130859375

   b = (a/8) + (a/256) + (a/512);

ถ้าใช้ภาษา c เขียนแค่นี้่ครับ ผมว่าเร็วแล้วนะ

ในการคูณหรือหารในระบบตัวเลข  Binary ใช้การเลื่อนบิทไปทางซ้ายหรือขวา (bit-shift) สำหรับ PIC16 ซึ่งมีแค่รีจิสเตอร์ขนาด 8 bits ก็มีขั้นตอนการ shift สำหรับเลข  unsigned int ขนาด 16bits เพิ่มขึ้นมาอีกนิดหน่อย

และก็ไม่จำเป็นต้องเขียนคำสั่งให้ใช้  shift operator >> แทนการหาร เพราะ compiler มันฉลาดจะแปลงให้เอง (ที่จริงแล้วจะแปลงเป็นอย่างอื่นไม่ได้อยู่แล้ว)

ถ้าไม่แน่ใจเรื่องค่าผิดพลาด ลองเอาไปคำนวณใน spreadsheet หาค่าผิดพลาดว่ารับได้หรือเปล่า
#22
ลืมเรื่อง RS485 และเอา ET-MINI 422/485  ออกไปก่อนครับ

กำหนดให้ชุดบนเป็นชุดที่(1) ชุดล่างเป็นชุดที่(2),  ให้ต่อแบบอนุกรม (Daisy chain) คือ TX(1) เข้า RX(2),  TX(2) เข้า RX(คอมพิวเตอร์)

*โปรแกรมในตัวที่(2) มีหน้าที่เพิ่มคือ ต้องคอยรับค่าเซนเซอร์จากตัวที่(1) และส่งผ่านไปเข้าคอมพิวเตอร์ด้วย

ถ้าอยากจะต่ออีกเป็นชุดที่(3)ก็ทำลักษณะเดียวกัน

ET-MINI 422/485 ก็เพียงแปลงสัญญาณจาก TTL เป็น RS485 , TX ก็จะเป็น T+/-  ,RX ก็จะเป็น R+/-
T+(1) ต่อ R+(2),  T-(1) ต่อ R-(2), T+(2) ต่อ R+(คอมพ์),  T-(2) ต่อ R-(คอมพ์)

สำหรับต่อเข้าคอมพ์ ของ ett ก็ใช้ ET-USB/RS422/485 http://www.ett.co.th/prod2009/ET-USB/ET_USB_RS422_485V2.html
หรือใช้ ET-MINI 422/485+ Arduino ได้เหมือนกัน, หรือ ET-MINI 422/485+ USB Converter จะดีกว่าถูกกว่า

วิธีนี้มีข้อเสียคือ
ต้องเดินสาย RS485 จากชุดที่(1) มาชุดที่(2) ก่อน
ถ้าอยากจะรับข้อมูลจากคอมพ์ทำไม่ได้

ปัญหาหลักไม่ได้อยู่ที่การต่อสาย ปรกติแล้วจะต่อแบบขนาน แต่กรณีนั้นต้องมีโปรแกรม (Protocol) ป้องกันไม่ให้ข้อมูลมาตีกันยุ่งไปหมด
#23
confirm ครับ ถ้าเลือกจ่ายเงินเป็นสกุลเงินบาท แม้ยอดไม่ถึง 3,000 ก็ไม่เสียค่าส่ง $40 ครับ

ส่วนรอ 3 อาทิตย์ อาจไม่เป็นเช่นนั้น เหมือนบอร์ดยอดนิยมตอนนี้ เลื่อนแล้วเลื่อนอีกเป็นเดือนสองเดือน mouser ประกาศขายก่อนแต่ไม่มีของส่ง เจ้าอื่นประกาศขายทีหลังแต่ได้ของก่อน แต่สั่งก่อนก็ได้ลองก่อนครับ

#24
เพิ่มความเร็วขึ้น เคลื่อนที่เร็วขึ้น, UI ให้เร็วขึ้น
เพิ่มตัวเลขหรือรูปภาพแสดงตำแหน่งกล่องบนจอในกรณีที่มอเตอร์เกิดเสียขึ้นมา ทำขายได้เลยครับ