Quote from: avr_lover on May 02, 2017, 08:42:32 AMก็คือ ถ้าผม เขียน อ่านค่า ADC ออกมาได้แล้วเช่น
ศึกษา ADC conversion + DS1820 interface แล้วประยุกต์ได้เลยครับ ค่าที่วัดต้องชดเชยผลจากอุณภูมิด้วยครับ
#include <16F887.h> #device adc=10 #fuses HS,NOWDT,NOPROTECT,NOLVP #define LCD_ENABLE_PIN PIN_D2 #define LCD_RS_PIN PIN_D0 #define LCD_RW_PIN PIN_D1 #define LCD_DATA4 PIN_D4 #define LCD_DATA5 PIN_D5 #define LCD_DATA6 PIN_D6 #define LCD_DATA7 PIN_D7 #use delay(clock=8000000) #include <lcd.c> #include <touch.c> // Read 1 wire BYTE ReadTemp_DS18B20(void) { BYTE i, buffer[9]; BYTE temp,sign; if (touch_present()) { touch_write_byte(0xCC); touch_write_byte (0x44); delay_ms(100); touch_present(); touch_write_byte(0xCC); touch_write_byte (0xBE); for(i=0; i<9;i++) buffer = touch_read_byte(); } temp = (buffer[1]<<4)|(buffer[0]>>4); if(buffer[1]&0xF0) temp=(-1)*temp; return(temp); } void main(void) { BYTE DS18B20_temp; SETUP_ADC(ADC_CLOCK_INTERNAL|ADC_CLOCK_DIV_8); SETUP_ADC_PORTS(sAN0|VSS_VDD); float averageVoltage; float CoefficientVolatge; float ECcurrent; float TempCoefficient; float ECcurrent1; lcd_init(); while(TRUE) { DS18B20_temp=ReadTemp_DS18B20(); SET_ADC_CHANNEL(0); averageVoltage=READ_ADC(); averageVoltage=(float)5000/1024*averageVoltage; TempCoefficient=(float)1.0+0.0185*(DS18B20_temp-25.0); CoefficientVolatge=(float)averageVoltage/TempCoefficient; ECcurrent=(float)CoefficientVolatge+CoefficientVolatge+CoefficientVolatge+CoefficientVolatge+CoefficientVolatge+CoefficientVolatge+CoefficientVolatge+CoefficientVolatge+CoefficientVolatge+CoefficientVolatge/10; lcd_putc("\f"); lcd_gotoxy(3,1); printf(lcd_putc,"Temp :%d %cC",DS18B20_temp,0xDF); lcd_gotoxy(3,2); printf(lcd_putc,"EC :%f ", ECcurrent); delay_ms(1000); } } |
Quote from: avr_lover on May 11, 2017, 08:01:13 AM
adc V-ref ต่อกับ 5V แล้วใช่ไหมครับ บอร์ดสำเร็จหรือทำเองครับ เป็นไปได้ print ค่า ADC ออกมาดูครับ ว่าเฉพาะ adc read แกว่งไหม ถ้าแกว่ง อาจต้องดู vcc กับ vref ว่าแรงดันนิ่งไหม มีสัญญาณรบกวนหรือเปล่า แล้วคงต้องอ่าน adc หลายๆครั้งและหาค่าเฉลี่ยที่อ่านได้แล้วค่อยเอามาคำนวณจะทำให้นิ่งขึ้นครับ
Original เขา มีบรรทัดนี้อยู่ครับ
// calculate the average:
AnalogAverage = AnalogValueTotal / numReadings;
Quote from: avr_lover on May 12, 2017, 08:15:03 AMได้แล้วครับ แต่ค่าก็ยังมีคลาดเคลื่อนอยู่แต่อยู่ในระดับที่รับได้ครับ มีคำถามอีกครับผม อันนี้ไม่รู้เลย ถ้า ผมต้องการเขียนปุ่มกดมาเซ็ตค่าเป็นเอาไปคุมการผสมนี้ก็ เขียน ยังไงอ่ะครับ ถ้าฟิกค่าแล้วไปคุมได้นะ แต่ อยากให้มันเซตได้อ่าครับ ขอบคุณครับ
ไม่ใช่ครับ ลองวัดทั้งหมดหลายๆรอบ แยกใส่ array เช่นอ่านทั้งหมด 5 รอบ เอาค่าที่ได้ทั้งหมดมาบวกกันแล้วหารด้วย 5 เป็นต้นครับ :)