voltaj=123 gibi sabit bir değer atayıp ekranda yazdırmayı deneyin. Yazılıyorsa read_adc de sorun vardır.
AN0 da multimetre ile ölçünce değer okuyor musunuz?
Adc pot un %100 değerinde 65472 gibi bir sayı okuyor. 1024 okuması gerekmez mi? Gerilim bölücüyü resimdeki gibi yaptım. Pot 10k da kullandım sonuç yine aynı. Sanırım pek farketmiyor. Yaptığım hesaplama;
Va=Vin*(5.6/5.6+3.9) => Va=Vin*0.5895
çözünürlük=5/1023= 0.00489
Voltaj=(Va/0.5895)=1.6964*Va=1.6964*0.00489*Adc'de okunan değer
Voltaj=0.008295*Adc'de okunan değer.
Bir başka yerde aşağıdaki gibi hesap yapılmış.
[
ADC Math
The accuracy depends upon the accuracy of the resistors at the input end and the stability of reference voltage, Vdd = +5V. I found Vdd is stable to +5.02 V. I measured R1 and R2, and their values are 1267 and 3890 Ohms. So this gives,
0 – 5.02 V Analog I/P ---> 0-1023 Digital Count
=> Resolution = (5.02 - 0)/(1023-0) = 0.004907 V/Count
Va = 1267*Vin/(1267+3890) = 0.2457*Vin
=> I/P voltage = 4.07*Va = 4.07* Digital Count * 0.004907
= 0.01997 * Digital Count
= 0.02*Digital Count (Approx.)
To avoid floating point, use I/P voltage = 2*Digital Count.
Example, suppose Vin = 7.6V. Then,
Va = 0.2457*Vin = 1.87V
=> Digital Count = 1.87/0.004907 = 381
=> Calculated I/P Voltage = 2*381 = 0762 = 07.6V (First 3 digits of 4 digit product)
]
CCS C kodu:
Kod:
#define LCD_ENABLE_PIN PIN_B2
#define LCD_RS_PIN PIN_B0
#define LCD_RW_PIN PIN_B1
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#include <lcd.c>
unsigned int16 adc_giris;
float gerilim;
void main()
{
set_tris_a(0x01);
set_tris_d(0x00);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0);
lcd_init();
while(TRUE)
{
set_adc_channel(0);
delay_us(20);
adc_giris=read_adc();
gerilim=adc_giris*0.008295;
printf(lcd_putc,"\f ADC= %lu ",adc_giris);
printf(lcd_putc,"\n Voltaj= %f V",gerilim);
delay_ms(1000);
}
}