ขอทราบหลักการตั้งค่า DMA ADC และ TIM ครับ

  • 8 Replies
  • 4256 Views
สวัสดีครับ

ผมเป็นมือใหม่เพิ่งหัดเล่นไมโ๕รคอนโทรลเลอร์ครับ

ผมเริ่มมาใช้บอร์ด STM32F107 ของ ETT ใช้ CPU เบอร์ STM32F107VCT6 ครับ ทีนี้ตอนนี้ผมกำลังหัดเขียนซอฟแวร์สำหรับอ่านค่าแรงดันโดยใช้พอร์ต ADC ในการอ่านค่าและใช้ DMA ในการบันทึกข้อมูลครับ ทีนี่ผมได้อ่านไกด์ไลน์และอ่านคู่มือแล้วแต่ยังไม่เข้าใจเท่าไรครับ ถามพี่ๆ ที่รู้จักเขาก็ไม่เคยเล่นบอร์ตระกูล STM32 เลยอยากทราบถึงหลักการตั้งค่า ADC DMA และการ interrupt ของ TIM ครับ และอยากทราบว่าถ้าต้องการรับค่ามาจาก DMA จะมีการรับค่ายังไงและใช้คำสั่งแบบไหนครับ

ขอบคุณครับ

*

Offline tha

  • *****
  • 3146
    • View Profile
ถ้าเริ่มต้นใหม่จริงๆ แนะนำว่าซื้อหนังสือ stm32 ของ INEX ลองมาอ่านดูครับ

ผมก็มือใหม่ไม่ได้เก่งอะไร

ตอนนี้ผมเขียนแต่ lpc2138 เนี้ยแระมีอยู่อันเดียว ขอยืมเค้ามา

อันอื่นไม่เคยเขียนหรอก แต่แนะนำให้ขยันดู datasheet ประกอบด้วยเยอะอ่ะนะ

เขียนลองผิดลองถูกไปก่อน ไม่เข้าใจก็โพสต์ถามได้ พี่ๆ เค้าให้คำตอบได้

อย่าไปรีบร้อนกับมัน

ตอนนี้ผมลองเขียนอยู่ครับ อ่านทั้งคู่มือ ทั้งงานตัวอย่างแล้ว แต่ยังไม่สามารถรับค่ามาจาก DMA ได้เลยครับ :(

*

Offline tha

  • *****
  • 3146
    • View Profile
พยายามเข้านะครับ จะได้เล่นเป็นเพื่อนกัน ผมแนบ file DMA ADC มาให้ดูด้วย(ลองหัดแนบไฟล์ดู) ผมก็เล่น stm32 มาได้ปีนึงพอดี ก็อาศัยอ่านหนังสืออ่าน manual และก็ศึกษาตัวอย่างเอา ถึงตอนนี้ก็พอจะรู้มากขึ้นเรื่อยๆแล้วละครับ

มันมีตัวอย่างการใช้อยู่ในแผ่นอยู่แล้วนะครับ คุณสามารถเปิด project template ที่ให้ไป ซึ่งมันจะทำการกำหนดรายละเอียดต่างๆเกี่ยวกับบอร์ด
รวมทั้งการเชื่อมโยงไฟล์ต่างๆที่ใช้ใน project ให้เรียบร้อยแล้ว แต่ตัวอย่างใน template มันเป็น ON/OFF LED ผ่าน touch screen โดย
template จะอยู่ใน

...\ETT Examples\ET_STM32_ARM_KIT_StdPeriph_Lib_V3.1.2\Project\Template\RVMDK

ส่วนตัวอย่าง code ของ ADC จะอยู่ในตัวอย่างของ peripheral ต่่างๆ คือ
...\ETT Examples\ET_STM32_ARM_KIT_StdPeriph_Lib_V3.1.2\Project\STM32F10x_StdPeriph_Examples

เพียงแต่ตัวอย่างเหล่านี้เขายังไม่ได้สร้างเป็น project ไว้ให้ แต่จะให้เฉพาะ source file ที่ต้องแก้ไขสำหรับตัวอย่างนั้นๆโดยส่วนของ ADC จะอยู่ใน
...\ETT Examples\ET_STM32_ARM_KIT_StdPeriph_Lib_V3.1.2\Project\STM32F10x_StdPeriph_Examples\ADC

และที่เป็นตัวอย่างเีกี่ยวกับ DMA จะเป็น
...\ETT Examples\ET_STM32_ARM_KIT_StdPeriph_Lib_V3.1.2\Project\STM32F10x_StdPeriph_Examples\ADC\ADC1_DMA

วิธีการก็คือ ให้คุณเปิด project ใน template ขึ้นมา จากนั้นก็ดูว่าในตัวอย่างของ ADC1_DMA มันมีไฟล์ใดที่ต้องแก้ไขบ้าง แล้วก็ตัดแปะแก้ไข เพิ่มเติมเนื้อ
หาส่วนที่เกี่ยวข้อง จากไฟล์ในตัวอย่างของ ADC1_DMA ไปยังไฟล์ที่เป็นชื่อเดียวกันใน project ให้ครบถ้วน

ตอนนี้ลองเขียนและคอมไพล์ผ่านแล้วครับ แต่ยังไม่ได้ทดสอบกับบอร์ดจริงเลย สงสัยต้องมีปัญหาอะไรให้แก้แน่ๆ เลย ถ้ามีปัญหาจริงๆ คงต้องรบกวนพี่ๆ ด้วยละครับ :)

จะว่าไปแล้ว อยากทราบว่าคำสั่ง extern เอาไว้ใช้ทำอะไรหรือครับ เพราะพี่ที่ให้คำแนะนำผมเขาให้ใช้แบบนี้น่ะครับ

extern __IO uint16_t ADCConvertedValue[];

*

Offline Jimmkung

  • *
  • 12
  • Innovate for Life
    • View Profile
    • http://www.nablatronics.com/
ผมก็กำลังทำโปรเจคเกี่ยวกับเรื่องนี้ครับ เพราะว่า ADC sampling ค่าให้น้อยมาก ผมไปวัดที่ 20 uS ADC ไม่สามารถอ่านค่าได้เลย เลยต้องใช้ DMA ADC ครับ ตอนนี้ก็สามารถ
อ่านค่าได้อยู่ที่ประมาณ 20 ค่าที่ 20 uS ครับ ผมใช้ Ride7 เขียนบน STM32F107VCT6 เหมือนกันครับ สำหรับมือใหม่ผมแนะนำให้ใช้ Ride7 คู่กับหนังสือของ INEX
ละเอียดดีอาจจะมีบักบ้างเล็กน้อย แต่โดยรวมดีมาก ถ้ามีปัญหาก็แอดอีเมลมาถามได้ครับ (Terawat.k@gmail)  จากคนที่ผ่านประสบการณ์เดียวกัน จะได้มาช่วยกันแชร์ความรู้น่ะครับ
ปล. ผมรู้น้อยมากๆสำหรับคอนโทรลเลอร์เบอร์นี้เพราะผมเพิ่งเริ่มเขียนโปรแกรม ถ้าปัญหายากๆ อย่าถามผมน่ะครับ ^^