วันพุธที่ 14 ธันวาคม พ.ศ. 2565

ATTiny88 analog read

   



    
Attiny 88 บอร์ดขนาด Nano ราคาถูก ราวๆ 1.2USD (ประมาณ 40-50บาท) มี IO บานเบอะ 26ขา ชนิดที่ว่าเอาไปทำ MODBUS DO 16 channel + AI 4 ยังเหลือ IO ว่างๆอยู่เลย
    หลังจากทำมาหลายเวลา ไม่รู้ว่าทำอีท่าไหน ทำ analog read ของ tiny88 ไม่ได้สักที ก็เลยไปลองทำตามคู่มือดู

    มันต้องกำหนดค่าเพื่อให้ ADC ทำงาน มีอยู่ 2 register ที่ต้องกำหนด คือ ADMUX และ ADCSRA

Fig.1 ADMUX setting refer to manual 17.13.1 on page 155

 

    REFS0 มันคือ reference source , set 1 ใช้  external เป็น Vcc ที่เลี้ยงบอร์ดนั่นแหล่ะ,0 ใช้ internal1.1V ถ้า analog input เกิน 1.1V ค่าที่ได้ก็จะเท่ากับ 1023
    ADLAR เก็บค่าแบบ shift left-rigt โดย 1 คือ left
    MUX3..0 คือ Analog input channel , เช่น 0b01 คือ ADC1

    ตัวอย่าง ADMUX = 0b1000001; เทียบกับ Vcc และใช้ช่อง ADC1 หรือว่าขา pin A1

Fig.2 ADCSRA setting refer to manual 17.13.2 on page 157

ADEN คือเปิดการใช้งาน ADC
ADSC คือการเริ่ม ADC
ADPS2..0 คือ prescalar ADC clock ซึ่งเป็นตัวหาร system clock
            ตัวอย่าง 0b011 division factor = 8 , ADC clock = 125kHz

ตัวอย่าง ADCSRA = 0b10000011, เปิดการใช้งาน และมี ADC clock 125kHz
โดยกำหนดไว้ใน setup
void setup(){
ADMUX = 0b1000001;                //
0b1000001 มันเท่ากับ 0x41
ADCSRA=0b10000011;
SoftSerial.begin(57600);            //
*Tiny88 ไม่มี hardware serial ต้องใช้ softwareserial.h
                                              //max baudrate 57600 เกินกว่านี้จะมีการรับส่งผิดพลาด แบบสังเกตุเห็นได้
}

เริ่มการใช้งานใน loop() ต้องกำหนด set ADSC logic 1 ของ  ADCSRA อีกที่ bit6 ADSC
loop(){
ADCSRA |=(1<<6);                  //เริ่ม converter  ส่วนผลลัพธ์จะเก็บไว้ใน register ADCH, ADCL
int val = ADCL | (ADCH<<8);    //เอาค่าออกมาใส่ตัวแปร ค่าที่ได้มี 10bit (0-1023)
SoftSerial.println(val);               //monitor ค่า
}

    ส่วนการอ่านค่าหลาย ADCx ต้องเข้าใจก่อนว่า ใน mode single conversion ถ้ามีการเปลี่ยนช่องที่ ADMUX ก่อนที่การ converter ก่อนหน้าจะสำเร็จ มันจะทิ้งค่าเก่าเพื่อมาทำงาน ADMUX ของ ADCx ใหม่
แล้วจะรู้ได้ไงว่ามันทำเสร็จตอนไหน ตามคู่มือบอกไว้ว่าถ้าการ converter กำลังทำอยู่และยังไม่เสร็จนั้น ADSC จะมี level high ส่วน free running mode จะใช้การดูที่ ADSC ไม่ได้ ต้องดู bit ADIF
    จากตรงนี้ก็รอให้มันมี level low แล้วเราค่อยกำหนดค่า ADMUX ของ channel อื่น
while(readBit(ADCSRA,6) == 1) {;}         //while level is 1 wait......

    ลองอ่านค่า 4 channel เริ่มจาก A0 - A3 วงรอบการอ่าน 120ms(อ่าน 4 ช่องใน 120ms) มี HMI คอยส่งคำสั่งมาให้ Tiny88 เป็น slave ตอบกลับไป  3ขา เป็นศูนย์เพราะต่อ GND และอีกอันปล่อยลอย(floating) มันก็แกว่งๆ จาก noise

*free running mode ค่า ADCH, ADCL มันจะเลื่อน คือเปลี่ยน ADMUX ตอนนี้ แต่จะได้ค่ารอบหน้า


At Dormitory
15/12/2022

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

MAPs

วันก่อนได้ลองเขียนแบบ แบบตัวนั้นมันต้องแนบแผนที่สังเขปของโครงการ ลองๆ แล้วก็ใช้ snazzymaps แล้วก็เอามาทำต่อใน inkscape มันก็ออกมาดูได้ระดับห...