วิธีการถอดรหัสสัญญาณอนุกรมที่ไม่ได้มาตรฐานอย่างมีประสิทธิภาพ


11

ฉันเป็นสมาชิกระดับปริญญาตรีของทีมวิจัยที่ทำงานในโครงการที่เกี่ยวข้องกับ ASIC ที่ส่งสัญญาณ RF และตัวรับสัญญาณไร้สายซึ่งควรส่งข้อมูลไปยังพีซีในที่สุด

รับผลลัพท์ที่รวดเร็วอย่างต่อเนื่องไม่ตรงกันสัญญาณอนุกรมที่ไม่ได้มาตรฐาน (เช่นไม่ SPI, I2C, UART ฯลฯ ) เพื่อให้งานของฉันคือการเขียนซอฟต์แวร์ไมโครคอนโทรลเลอร์เพื่อติดต่อรับสัญญาณไปยังเครื่องคอมพิวเตอร์ ขณะนี้วิธีการของฉันคือการใช้การขัดจังหวะแบบ Edge-Trigger เพื่อวางข้อมูลในบัฟเฟอร์แบบวงกลมและทำกระบวนการถอดรหัสแบบทีละบิตในลูปหลัก ไมโครคอนโทรลเลอร์จะต้องส่งออกข้อมูลนี้พร้อมกันโดยใช้ USB (พอร์ต com เสมือน) ไปยังคอมพิวเตอร์

นี่คือปัญหาที่ฉันมีและสิ่งที่ฉันคาดการณ์ไว้:

  1. ฉันไม่สามารถประมวลผลข้อมูลบัฟเฟอร์ได้เร็วพอแม้จะใช้โปรเซสเซอร์ ARM Cortex M3 ที่ทรงพลังมากของฉัน บิตเรตคือ 400 Kbps (2.5 us / bit) สำหรับการอ้างอิงที่เหลือเพียง 180 รอบต่อบิต (รวมถึงการถอดรหัสและ ISR ซึ่งมี ~ 30 รอบอุ๊ยค่าใช้จ่าย!) นอกจากนี้ MCU ยังต้องจัดการกับงานอื่น ๆ อีกมากซึ่งจะทำการสำรวจในการวนซ้ำหลัก

  2. ไดรเวอร์พอร์ตเสมือนของ USB นั้นอินเตอร์รัปต์เช่นกัน นี่ทำให้ฉันเกือบแน่ใจว่าในที่สุดไดรเวอร์จะมีตัวประมวลผลถูกขัดจังหวะเป็นเวลานานจนคิดถึง 2.5 microsecond (180 รอบ) ซึ่งอาจมีการส่งบิต ฉันไม่แน่ใจว่าการขัดจังหวะความขัดแย้ง / เผ่าพันธุ์เช่นนี้จะได้รับการแก้ไขตามปกติอย่างไร

ดังนั้นคำถามก็คือสิ่งหนึ่งที่อาจทำเพื่อแก้ไขปัญหาเหล่านี้หรือนี่ไม่ใช่แนวทางที่ถูกต้องเลย? ฉันยินดีที่จะพิจารณาแนวทางการใช้ซอฟต์แวร์เป็นศูนย์กลางเช่นกัน ตัวอย่างเช่นการใช้ชิป USB เฉพาะกับเครื่องสถานะฮาร์ดแวร์บางอย่างสำหรับการถอดรหัส แต่นี่คือดินแดนที่ไม่คุ้นเคย


ฉันต้องบอกว่ามันเป็นเรื่องยากที่ฉันจะเห็นว่าคำแนะนำมากมายที่ฉันชอบตอบว่าเร็วพูดกับคำถามของคุณได้ดี ฉันสนใจที่จะทราบข้อมูลเพิ่มเติมเกี่ยวกับข้อมูลที่ซ่อนอยู่ พวกมันจะระเบิดเร็วเต็มความเร็วและจากนั้นช่วงเวลาของข้อมูลต่ำหรือเป็นไปได้ว่าคุณจะใช้เวลานานกับข้อมูลต่อเนื่องหรือไม่?
Kortuk

ตราบใดที่ ASIC มีพลังมันก็จะส่งกระแสข้อมูลอย่างต่อเนื่อง ไม่ระเบิดเลย มันเป็นแอพพลิเคชั่นตรวจวัดทางการแพทย์แบบเรียลไทม์พร้อมการอ่านค่าคอมพิวเตอร์ เคยเห็น EKG หรือไม่
Keegan Jay

คำตอบที่ยอดเยี่ยมมากมายที่นี่ ฉันเห็นการแบ่งที่ชัดเจนระหว่างโซลูชันที่เกี่ยวข้องกับการเปลี่ยนแปลงอินเทอร์รัปต์และโซลูชันที่เกี่ยวข้องกับฮาร์ดแวร์ / ตรรกะดิจิทัล สิ่งต่างๆเช่น FPGA และ Verilog ที่ฉันคุ้นเคย แต่ยังไม่เคยมีประสบการณ์ดังนั้นนี่หมายความว่าพวกเขาจะต้องได้รับการช่วยเหลือในระยะยาว ใน @rocketmagnets ระยะสั้นวิธีการขัดจังหวะหนักน้อยดี ฉันชอบความสง่างามของการอุทิศงานคนรับใช้ให้กับตรรกะดิจิทัลและการบันทึก ARM สำหรับการคำนวณที่แท้จริง ในอนาคตกำลังของ ARM จะใช้สำหรับการวิเคราะห์และกรองข้อมูลอนุกรมไร้สาย
Keegan Jay

สัญญาณซิงโครนัสหรืออะซิงโครนัสหรือไม่?
เครื่องหมาย

ไม่ตรงกัน 4 start bits, 10 data bits, 2 stop bits เนื่องจากลักษณะของ ASIC ที่ส่งสัญญาณเวลา HI และ LO แตกต่างกันอย่างมากจากชิปไปยังชิป ฉันได้เขียนอัลกอริทึมแล้วเพื่ออนุมานอัตราการรับส่งข้อมูล
Keegan Jay

คำตอบ:


5

คำตอบอื่น: หยุดใช้อินเทอร์รัปต์

ผู้คนข้ามไปใช้อินเทอร์รัปต์ง่ายเกินไป โดยส่วนตัวแล้วฉันไม่ค่อยได้ใช้มันเพราะพวกเขาเสียเวลามากในขณะที่คุณกำลังค้นพบ

บ่อยครั้งที่มันเป็นไปได้ที่จะเขียนลูปหลักที่โพลทุกอย่างอย่างรวดเร็วนั่นคือเวลาแฝงนั้นอยู่ในข้อมูลจำเพาะและเสียเวลาน้อยมาก

loop
{
    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (serial_byte_ready)
    {
        // decode serial data
    }

    if (enough_serial_bytes_available)
    {
        // more decoding
    }        

    if (usb_queue_not_empty)
    {
        // handle USB data
    }        
}

อาจมีบางสิ่งในลูปที่เกิดขึ้นบ่อยกว่าสิ่งอื่น บางทีบิตขาเข้าเช่นในกรณีนี้ให้เพิ่มการทดสอบเหล่านั้นมากขึ้นเพื่อให้ตัวประมวลผลจำนวนมากทุ่มเทให้กับงานนั้น

loop
{
    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (serial_byte_ready)
    {
        // decode serial data
    }

    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (enough_serial_bytes_available)
    {
        // more decoding
    }        

    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (usb_queue_not_empty)
    {
        // handle USB data
    }        
}

อาจมีบางเหตุการณ์ที่เวลาแฝงของวิธีนี้สูงเกินไป ตัวอย่างเช่นคุณอาจต้องการเหตุการณ์ที่กำหนดเวลาอย่างแม่นยำมาก ในกรณีนี้ให้มีเหตุการณ์นั้นขัดจังหวะและมีทุกอย่างอื่นในลูป


ฉันชอบคำตอบของคุณมากกว่าคำตอบของคนอื่น Rocketmagnet แทนที่จะเป็นฮาดแวร์ฮาร์ดแวร์ที่เร็วกว่าและอื่น ๆ อีกมากคุณ Rocketmagnet แนะนำให้ทำน้อยลงดีขึ้นง่ายขึ้น

โอเคฉันเคยเห็นหลายกรณีถูกขัดจังหวะการแก้ปัญหาให้ดีขึ้นมาก พวกเขาทำสิ่งที่ดีให้รหัสที่มีโครงสร้างดีเวลาแฝงต่ำและข้อดีอื่น ๆ อีกมากมาย แต่ฉันต้องเห็นด้วยกับคุณที่นี่ ดูเหมือนว่ากระบวนการดังกล่าวมีความเข้มข้นสูง 1 ตัวควบคุมอาจต้องอุทิศความสนใจของตนทุกบิตเพื่อจัดการกระแสข้อมูลอนุกรม ส่วนหน้าดิจิทัลเหมาะกับฉัน แต่หลายครั้งที่คุณมีไมโครสโคปและไม่มี FPGA อยู่รอบ ๆ เมื่อเป็นโครงการโรงเรียนฉันอาจจะอุทิศไมโครเพื่อจัดการมันให้ฉันก่อนและลองใส่ FPGA ในภายหลังเพื่อแทนที่ ราคา
Kortuk

นี่อาจเป็นทางออกที่ฉันจะไปด้วยในระยะสั้น ฉันหวังว่าจะหลีกเลี่ยงสิ่งนี้เพราะมันเกี่ยวข้องกับการเขียนโปรแกรมควบคุมซีเรียลที่มีอยู่อีกเล็กน้อย แต่มันเป็นโซลูชันที่สง่างามที่อยู่ในความสามารถของฉันในช่วงเวลาสั้น ๆ
Keegan Jay

1
@ JayKeegan - ใช่อาจเป็นเส้นทางที่เร็วที่สุดในการแก้ปัญหา PSoC และ FPGA อาจเป็นแนวทางสำหรับโครงการต่อไป
Rocketmagnet

6

คุณอาจใช้ FPGA แทนไมโครคอนโทรลเลอร์เพื่อถอดรหัสและบัฟเฟอร์ดาต้าสตรีมแบบไร้สาย จากนั้นใช้หน่วยประมวลผล ARM เพื่อล้างบัฟเฟอร์ FPGAs (เช่นใช้อินเตอร์เฟส SPI) และส่งเนื้อหาออกพอร์ต USB Comm มันใช้งานได้ แต่ FPGA ควรสามารถติดตามได้อย่างง่ายดายตราบใดที่คุณสามารถให้บริการได้บ่อยครั้งพอที่จะรับประกันได้ว่าบัฟเฟอร์ฮาร์ดแวร์ของมันจะไม่ทำงานหนักเกินไป (หรือถ้าคุณสามารถจัดการกับข้อมูลที่หลุดในระดับที่สูงกว่าของโปรโตคอล )


นี่อาจเป็นทางออกที่ยอดเยี่ยมในระยะยาว ฉันหวังว่าฉันจะได้รับการแก้ปัญหาด้านตรรกะ / ฮาร์ดแวร์ดิจิตอลเพิ่มเติมจากโซลูชันซอฟต์แวร์เพราะตอนนี้ฉันมีข้ออ้างที่จะเรียนรู้เกี่ยวกับสิ่งเหล่านี้! ฉันไม่มีประสบการณ์กับ FPGAs แต่น่าเสียดายที่
Keegan Jay

6

ง่าย: ใช้PSoC5 ไมโครคอนโทรลเลอร์

PSoC

คุณมีความสะดวกในการใช้ไมโครคอนโทรลเลอร์รวมถึงมี CPLD เพื่อให้คุณสามารถเขียนอุปกรณ์ต่อพ่วงฮาร์ดแวร์ของคุณใน Verilog ได้ เพียงเขียนตัวถอดรหัสข้อมูลอนุกรมของคุณใน verilog และใช้ DMA เพื่อสตรีมไปยังพอร์ต USB

ในขณะเดียวกัน ARM 32-bit ARM อันทรงพลังสามารถใช้คำสั่ง Thumb ได้ซ้ำสองครั้ง


หน้าภาพรวมไม่ได้แสดงรายการความถี่สัญญาณนาฬิกาซึ่งทำให้ฉันสงสัย แผ่นข้อมูลบอกว่า 40MHz (ฉันยังบันทึก 6mA ที่ 6MHz) นั่นคือครึ่งหนึ่งของสิ่งที่ OP มีตอนนี้ "MCU ยังต้องจัดการกับงานอื่น ๆ อีกมากมาย" ดังนั้นมันอาจขึ้นอยู่กับว่ามันเป็นความคิดที่ดีหรือไม่
stevenvh

พวกเขาไปถึง 67MHz ดังนั้นมันเกือบจะเร็วเท่ากับโปรเซสเซอร์ปัจจุบันของ OP ยกเว้นว่างานส่วนใหญ่จะทำในฮาร์ดแวร์ปล่อยให้ CPU มีเวลาว่างมากขึ้น
Rocketmagnet

1
ผมไม่ได้ดูทั้งหมดเอกสารข้อมูลทางเทคนิค คนแรกที่ฉันเลือก 40MHz กล่าว
stevenvh

@stevenvh - พวกเขามีเกรดความเร็วที่แตกต่างกัน หมายเลขที่สามใน PN คือระดับความเร็ว (4 = 48MHz, 6 = 67MHz)
Rocketmagnet

1
นี่เป็นทางออกที่ยอดเยี่ยมในระยะยาวเช่นเดียวกับแนวคิด FPGA ฉันไม่เคยได้ยินเรื่องชิปประเภทนี้มาก่อน ในอนาคตนี่อาจหมายถึงตัวรับทั้งหมดพอดีกับขนาดของ thumb drive ซึ่งเป็นวิสัยทัศน์ของหัวหน้าโครงการของฉัน ฉันจะเรียน Verilog ในเทอมหน้า
Keegan Jay

4

ฉันคิดว่าคุณมีทางเลือกวิศวกรรมคลาสสิกในการเลือก: รวดเร็วถูกงาน: เลือกสองแบบ

วิธีแก้ปัญหาของ @ vicatcu นั้นเป็นวิธีที่ดี แต่ถ้าคุณไม่สามารถเพิ่มฮาร์ดแวร์เพิ่มเติมได้ (และนี่รวมถึงตัวประมวลผลที่เร็วกว่า) ดังนั้นคุณต้องเลือก หากลิงค์อนุกรมนี้สำคัญที่สุดที่คุณควรนั่งใน ISR จนกว่าจะมีการรวบรวมบิตทั้งหมด 180 คำสั่งต่อบิตนั้นไม่เลวเลย แต่อย่าพยายามทำทุกอย่าง เมื่อคุณตรวจพบจุดเริ่มต้นของการถ่ายโอนให้หมุนจนกว่าการถ่ายโอนจะเสร็จสมบูรณ์ บันทึกผลลัพธ์ลงใน FIFO แล้วดำเนินการประมวลผลปกติต่อ

คุณไม่ได้บอกว่าการส่งสัญญาณแต่ละครั้งนั้นนานแค่ไหน แต่ถ้ามันสั้นและระเบิดได้นี่จะเป็นทางออกที่ทำงานได้ ฉันยินดีที่จะเดิมพันว่าการใช้งานพอร์ต COM เสมือนของคุณมีการบัฟเฟอร์ฮาร์ดแวร์เช่นกันดังนั้นบริการขัดจังหวะ "ล่าช้า" เนื่องจากไม่ควรมีปัญหามากเกินไป เท่าที่เหลือจากสิ่งที่ MCU จำเป็นต้องทำ ... คุณมีการตัดสินใจในการออกแบบ


โซลูชันนี้ช่วยเติมเต็มแนวทางซอฟต์แวร์ของ rocketman ด้วยการลดจำนวนไดรเวอร์ที่ใช้อินเตอร์รัปต์ ฉันอาจเก็บไดรเวอร์อนุกรมหลักที่ฉันกล่าวถึงว่าใช้อินเตอร์รัปต์ ฉันจะลองหมุนจนกว่าจะอ่านเฟรมทั้งหมดตามที่คุณพูดถึง
Keegan Jay

3

ก่อนอื่นฉันชอบคำตอบที่นี่แล้วบางคนได้รับการโหวตของฉัน

แต่เพียงเพื่อจะหาทางออกที่เป็นไปได้อีก: เนื่องจากข้อ จำกัด ของโครงการของคุณจะเพิ่มไมโครคอนโทรลเลอร์ตัวที่สองให้เสีย (ซึ่งจะเกี่ยวข้องกับบอร์ดอื่น) อาจเป็นไมโครคอนโทรลเลอร์ 8 บิตแบบง่ายที่เชื่อมต่อกับ Cortex-M3 ของคุณผ่านอุปกรณ์ต่อพ่วงที่รวดเร็วเช่น SPI ตัวควบคุม 8 บิตที่คุณเลือกจะโพลสำหรับบิตและรูปแบบไบต์เช่นเดียวกับในคำตอบที่เลือก แต่เมื่อมันมีไบต์ก็สามารถถ่ายโอนข้อมูลไปยัง SPI data register สำหรับการถ่ายโอนออก

ด้าน cortex-M3 นั้นจะรบกวนข้อมูล SPI ที่ได้รับ นั่นจะลดการขัดจังหวะจากขอบภายนอก 400 KHz ก่อนหน้าของคุณเป็น 50 KHz

เหตุผลสองประการที่ฉันแนะนำนี้เป็นเพราะวิธีการอื่น (PSoC หรือ FPGA เพิ่มเติม) มีราคาแพงเล็กน้อย (แม้ว่าสิ่งนี้อาจไม่สำคัญสำหรับโครงการทางวิชาการที่มีปริมาณน้อย) และอาจช่วยให้คุณรักษา โครงสร้างของรหัสปัจจุบันของคุณ

นอกจากนั้นฉันคิดว่าความคิด PSoC นั้นยอดเยี่ยมด้วยการถ่ายโอนอุปกรณ์ต่อพ่วงที่กำหนดเองของคุณผ่าน DMA ไปยัง USB


นี่คือแผนการที่ฉันมีอยู่ในใจเกี่ยวกับการโพสต์สิ่งนี้ ถ้าฉันไม่สามารถปรับปรุงซอฟต์แวร์โดยลดการพึ่งพาการขัดจังหวะ (คำตอบที่เลือก) กว่าแน่นอนว่านี่คือสิ่งที่ฉันจะทำ แต่ใช่มันจะต้องใช้บอร์ดอื่นอาจเป็นสองเพราะฉันดูดที่ทำให้การออกแบบของฉันถูกต้องในครั้งแรก
Keegan Jay

@ JayKeegan, ฮ่าฮ่ายินดีต้อนรับสู่สโมสร!
Jon L

2

หากรูปแบบข้อมูลของคุณคล้ายกับของ UART แต่ด้วยอัตราการรับส่งข้อมูลที่คาดเดาไม่ได้ แต่ที่สอดคล้องกันความชอบของฉันคือการใช้ CPLD เพื่อแปลงทุกคำของข้อมูลที่เข้ามาเป็นรูปแบบ SPI หรือมาตรฐาน async ฉันไม่คิดว่ามีความจำเป็นที่จะต้องผลักดันให้เข้าสู่อาณาจักรของ CPLD จริงๆแล้วแม้แต่ตรรกะที่ไม่ต่อเนื่องอาจจะใช้การได้ หากคุณสามารถสร้างนาฬิกาที่เป็น smidgin มากกว่า 5 เท่าของอัตราข้อมูลที่คุณต้องการคุณสามารถใช้ตัวนับหารห้าคูณห้าและหารด้วย 16 ตัวนับกับประตูสองสามตัว จัดเรียงตัวหารทีละห้าเพื่อให้มันถูกรีเซ็ตในทุกครั้งที่อินพุตไม่ได้ใช้งานและตัวหารหารด้วย 16 จะอยู่ที่ศูนย์ มิฉะนั้นจะสร้างพัลส์นาฬิกา SPI และชนตัวนับหารด้วย 16 ทุกครั้งที่ตัวนับหารด้วยห้าตี 2

เมื่อให้เวลา 5x นาฬิกาเราสามารถสร้างนาฬิกา SPI โดยใช้ 16V8 ซึ่งเป็นอุปกรณ์ลอจิกที่สามารถตั้งโปรแกรมได้ซึ่งมีขนาดเล็กที่สุดและราคาถูกที่สุดในปัจจุบัน) 16V8 หรือ 22V10 ที่สองสามารถใช้เป็นตัวแบ่งอัตราเศษส่วนเพื่อสร้างนาฬิกา 5 เท่าหรือหนึ่งสามารถใช้ชิปขนาดใหญ่กว่าเล็กน้อย (CPLD) และทำทุกอย่างในที่เดียว

แก้ไข / ภาคผนวก

เมื่อพิจารณาเพิ่มเติมหากมีใครจะใช้ CPLD เราสามารถเพิ่มการปรับปรุงเพิ่มเติมบางอย่างในวงจรได้อย่างง่ายดาย ตัวอย่างเช่นอาจเพิ่มตรรกะอย่างง่ายดายเพื่อให้มีแผงวงจรจนกว่าจะได้รับบิตหยุดอย่างน้อย 1.5 บิตตามด้วยบิตเริ่มบิต 3.5 หากได้รับบิตเริ่มสั้นเกินไปควรกลับไปค้นหาบิตหยุด นอกจากนี้หากมีการใช้ SPI เราสามารถใช้สัญญาณ / CS เพื่อให้แน่ใจว่าอุปกรณ์ที่รับจะเห็นข้อมูลที่มีกรอบอย่างถูกต้อง หากอุปกรณ์ที่รับข้อมูล SPI สามารถรองรับเฟรมขนาด 10 บิตจะสามารถส่งเฟรมดังกล่าวได้โดยตรง มิฉะนั้นเฟรมสิบบิตแต่ละเฟรมสามารถส่งเป็นเฟรม 8 บิตพร้อมชุด LSB (ข้อมูล 7 บิต) และเฟรมที่มีทั้งหมดของ LSB ชัดเจน (3 บิตของข้อมูล); นาฬิกา SPI จะถูกเร่งระหว่างบิตหยุดดังนั้นข้อมูลทั้งหมดจะถูกส่ง

ไมโครคอนโทรลเลอร์บางตัวมีโมดูลการสร้าง PWM ที่หลากหลายซึ่งรวมถึงสิ่งต่าง ๆ เช่นความสามารถในการรีเซ็ตโดยสัญญาณภายนอกและซิงโครไนซ์เวลาของพวกเขากับการปล่อยสัญญาณดังกล่าว หากไมโครคอนโทรลเลอร์ของคุณสามารถทำเช่นนั้นได้ทั้งนี้ขึ้นอยู่กับคุณสมบัติที่แน่นอนซึ่งอาจทำให้ CPLD หรือวงจรกำหนดเวลาทำได้ง่ายขึ้น

อีกวิธีหนึ่งที่ Rocketmagnet แตะค่อนข้างจะมีขนาดเล็กซึ่งมีวัตถุประสงค์เพียงอย่างเดียวคือการถอดรหัสข้อมูลอนุกรมและแปลงเป็นรูปแบบที่สามารถใช้งานได้โดยไมโครหลัก อัตราการส่งข้อมูล 400KHz ของคุณนั้นค่อนข้างเร็วสำหรับการถอดรหัสซอฟต์แวร์ แต่บางอย่างเช่น PIC สามารถจัดการได้หากไม่ต้องทำสิ่งอื่นในเวลาเดียวกัน ขึ้นอยู่กับอุปกรณ์ที่คุณคุ้นเคยนี่อาจเป็นเรื่องง่ายหรือยากกว่าการใช้ CPLD


ทั้งหมดนี้จะมีค่ามากเมื่อออกแบบตรรกะดิจิทัลสำหรับการถอดรหัส ฉันจะแสดงผลเป็น SPI ตอนนี้ฉันเพิ่งจะถอดรหัสโดยใช้ MCU แบบสแตนด์อโลน (ข้อ จำกัด ด้านเวลา) ขอขอบคุณ!
Keegan Jay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.