[TH] Cortex-M0+: SAMD21

บทความนี้แนะนำบอร์ดไมโครคอนโทรลเลอร์ที่ใช้ชิพ ATSAMD21G18 ของบริษัท Microchip ที่ใช้สถาปัตยกรรม ARM แบบ 32 บิต แกนตระกูล Cortex-M0+ ในรูปแบบบอร์ดตามตระกูล Arduino Uno ดังภาพที่ 1

ภาพที่ 1 บอร์ด SAMD21 ในฟอร์มของ Arduino Uno

คุณสมบัติ

บอร์ดไมโครคอนโทรลเลอร์ที่พวกเราเลือกมาใช้งานใช้ชิพ ATSAMD21G18 ที่มีคุณสมบัติ ดังนี้

  • ทำงานที่ความถี่สูงสุด 48MHz
  • ฮาร์ดแวร์รองรับการคูณในวงรอบการทำงานเดียว
  • มีหน่วยความจำแรมแบบ SRAM ขนาด 32KB
  • มีหน่วยความจำแฟลชสำหรับใช้งานขนาด 256KB
  • พอร์ตสื่อสารแบบอนุกรมจำนวน 6 พอร์ต (SERCOM) ที่สามารถตั้งค่าให้ทำงานเป็นการสื่อสารดังต่อไปนี้
    • พอร์ตสื่อสารอนุกรม UART/USART
    • SPI
    • I2C ที่ความเร็ว 3.4MHz
    • SMBUS/PMBUS
    • LIN Slave
  • Timer/Counter ขนาด 16 บิต จำนวน 5 ชุด ที่สามารถตั้งค่าการทำงานให้เป็นดังต่อไปนี้ได้
    • 16 บิต TC พร้อม compare และ capture
    • 8 บิต TC พร้อม compare และ capture
    • 32 บิต TC พร้อม compare และ capture
  • Timer/Counter ขนาด 24 บิต จำนวน 3 ชุด
  • 32 บิต RTC (Real Time Clock) ที่ทำงานเป็นนาฬิกาและปฏิทิน
  • PWM จำนวน 20 ช่องสัญญาณ
  • ADC (Analog to Digital Convertor) ขนาด 12 บิต จำนวน 1 ช่องสัญญาณ ทำงานที่ 350ksps หรือ 350,000 ครั้งต่อวินาที
  • DAC (Digital to Analog Convertor) ขนาด 10 บิต จำนวน 1 ช่องสัญญาณ ที่ความเร็ว 350ksps
  • ทำงานที่แรงดัน 1.62 ถึง 3.63V
  • รองรับแหล่งขัดจังหวะภายนอก (External Interrupt) จำนวน 16 แหล่ง
  • โปรแกรมด้วย SWD ได้
  • มีโหมด idle และ sleep ทำให้ประหยัดพลังงาน
  • มีระบบ DMAC หรือ Direct Memory Access Control จำนวน 12 ช่องสัญญาณ
  • มีระบบรองรับเหตุการณ์ (Event System) จำนวน 12 ช่องสัญญาณ
  • รองรับ Touch Control (PTC) สูงสุด 256 ตัว

การติดตั้งบอร์ด

การติดตั้งสามารถทำได้ 2 แบบ คือ

  1. เสียบบอร์ดแล้วเปิดโปรแกรม Arduino IDE ถ้าระบบยังไม่เคยติดตั้งมาก่อนจะมีข้อความเตือนให้ติดตั้งบอร์ด ดังภาพที่ 3 หลังจากนั้นคลิกเลือกจะเข้าหน้าต่าง Boards Manager และมีรายการบอร์ดให้เลือกดังภาพที่ 4 ให้ดำเนินคลิกที่ติดตั้ง
  2. ติดตั้งเองโดยเข้าโปรแกรม Arduino IDE แล้วเลือกเมนู Boards Manager … จากรายการ Board ของเมนู Tools ดังภาพที่ 2 หลังจากนั้นในหน้าจอของ Boards Manager ให้ค้นหา Arduino SAMD Boards (32-bits ARM Cortex-M0+) ดังภาพที่ 4 แล้วให้คลิกติดตั้ง
ภาพที่ 2 เมนู Boards Manager …
ภาพที่ 3 ตัวอย่างการแจ้งเตือนเมื่อพบบอร์ดที่ยังไม่ได้ติดตั้ง
ภาพที่ 4 รายการของบอร์ด Arduino SAMD Boards (32-bots ARM Cortex-M0+)

เมื่อติดตั้งเรียบร้อยคราวนี้ก็พร้อมใช้งาน แต่บอร์ดที่ซื้อมานั้นเป็นรุ่นพัฒนาต่อจาก Arduino Zero ดังนั้น ให้เลือกบอร์ด Arduino Zero (Native USB Port) จากรายการในเมนู Arduino SAMD (32-bits ARM Cortex-M0+) จากรายการเมนู Board ของเมนู Tools ดังภาพที่ 5

ภาพที่ 5รายการเมนูใน Arduino SAMD (32-bits Cortex-M0+) Boards

สุดท้ายให้ตรวจสอบว่า Port ถูกต้องตามตัวอย่างในภาพที่ 6

ภาพที่ 6 รายการ Port

ตัวอย่างโปรแกรม

ตัวอย่างโปรแกรมค้นหาเลขจำนวนเฉพาะที่แสดงผลผ่านทางพอร์ตสื่อสารอนุกรม USB ของบอร์ดจะใช้คลาส SerialUSB แทน Serial ในโปรแกรมปกติ ซึ่งบนบอร์ดนั้นมีคลาสสำหรับสื่อสารกับพอร์ตอนุกรมให้ใช้งาน 3 พอร์ตดังนี้

  • Serial สำหรับขา Tx/Rx ที่อยู่กับเสาเชื่อมต่อ ICSP
  • SerialUSB สำหรับใช้การสื่อสารจากพอร์ต USB ของบอร์ด
  • Serial1 สำหรับใช้ผ่านทางขา Tx/Rx เดิมของบอร์ดในฟอร์มของ Arduino Uno

โค้ดโปรแกรมเป็นดังนี้


uint32_t counter = 0;
uint32_t t0, t1;
uint32_t t2000;

uint32_t isPrimeNumber(uint32_t x) {
  uint32_t i;
  for (i = 2; i < x; i++) {
    if (x % i == 0) {
      return 0;
    }
  }
  if (i == x)
    return 1;
  return 0;
}


void testPrimeNumber(uint32_t maxN) {
  counter = 0;
  t0 = millis();
  for (uint32_t n = 2; n < maxN; n++) {
    if (isPrimeNumber(n)) {
      counter++;
    }
  }
  t1 = millis();
}


void setup() {
  SerialUSB.begin(115200);
  SerialUSB.println();
}

void loop() {
  testPrimeNumber(2000);
  SerialUSB.print("\n\nTest 2,000 times : Found ");
  SerialUSB.print(counter, DEC);
  SerialUSB.print(" in ");
  t2000 = int(fabs(t1 - t0));
  SerialUSB.print(t2000, DEC);
  SerialUSB.println(" milliseconds.");
  delay(15000);
}

ผลลัพธ์ที่ได้เป็นดังนี้ ซึ่งจะพบว่าใช้เวลาไป 308 มิลลิวินาที

เมื่อเปรียบเทียบการหาตัวเลขจำนวนเฉพาะในช่วง 2-1000 ไปจนถึง 2 ถึง 20,000 โดยแต่ละรอบเพิ่มจำนวนการหาครั้งละ 5000 ของไมโครคอนโทรลเลอร์ esp32, esp8266, STM32C103, Arduino Due, SAM-D21 และ Raspberry Pi PICO เป็นดังกราฟภาพที่ 7

ภาพที่ 7 กราฟเปรียบเทียบเวลาที่ถูกใช้ในการหาจำนวนเฉพาะของบอร์ดต่าง ๆ

สรุป

จากบทความนี้จะพบว่าบอร์ด SAMD21 ที่เป็นไมโครคอนโทรลเลอร์ ARM แบบ 32 บิตนั้น รองรับการทำงานทั้ง ADC และ DAC พร้อมทั้งปริมาณหน่วยความจำที่มากกว่า Arduino Uno และพอเพียงสำหรับการใช้งานในระดับไม่ซับซ้อนมาก และให้พอร์ตสื่อสารอนุกรมมาให้ใช้งานได้พร้อมกัน 3 พอร์ต ทำให้นำมาใช้งานคู่กับ ESP32 เพื่อชดเชยการทำงาน ADC และ DAC โดยส่งข้อมูลระหว่าง Serial1 ของแต่ละบอร์ด สุดท้าย ขอให้สนุกกับการเขียนโปรแกรมครับ

แหล่งอ้างอิง

  1. Starting Electronics. (2018). WeMos SAMD21 Arduino M0 Quick Start Tutorial. เข้าถึงเมื่อ 2021-11-18
  2. MicroChip. (2021). SAM D21/DA1 Family. เข้าถึงเมื่อ 2021-11-18

(C) 2020-2022, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-11-18, 2021-11-19, 2022-01-19