Tak jsem si zase řekl, že se naučím něco nového. Dneska jsem dostal nápad s AD převodníkem MAX187.
Zapojil jsem ho podle datasheetu (schema zde)
podle datasheetu obsahuje referenci 4.096V. Napsal jsem si rutinu, kterou ten ADC obsluhuju a zobrazuju údaj na LCD, ale ukazují se mi tam čísla a znaky které podle mě nemají.
Třeba nastavil jsem si vstupní napětí 2.00V (podle multimetru) a na LCD se mi zobrazuje údaj: -167xx, kde xx se mi mění a to hodně rychle.
Komunikaci SPI jsem si nastavil na 1MHz.
Jako MCU používám ATmegu16 & 16MHz krystal.
Nenašel by se někdo kdo by pomohl?
Kód: Vybrať všetko
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lcd.h" //knihovna pro komunikaci s LCD 2004
// Mega16 rozložení pinu
#define MOSI 4
#define MISO 6
#define SCLK 7
#define SS 4
char buffer[50];
unsigned int get_adc(unsigned char adata)
{
static unsigned int temp=0;
PORTB &= ~(1<<SS); // SET CS do 0 (aktivovani ADC)
_delay_us(10); // zde by měla být krátká prodleva??
SPDR = adata; // vložit data do odesílací registru
while(!(SPSR & (1<<SPIF))); // Poslat 1 byte přes HW SPI a čeka na tx
temp = SPDR; // přijatá data nahraje do proměnné TEMP
temp = temp << 8; // posune proměnnou TEMP o 8 vlevo
SPDR = adata; // vloží data do odesílacího registru
while(!(SPSR & (1<<SPIF))); // Poslat 1 byte přes HW SPI a čeka na tx
temp |= SPDR; // přijatá data nahraje do proměnné TEMP
PORTB |= (1<<SS); // nastavi CS do 1 a tim zakaze ADC
return temp; // navratí hodnotu ADcka
}
void spim_init(void)
{
// SET PORT B jako výstup
DDRB |= (1<<MOSI) | (1<<SCLK) | (1<<SS);
// SET MISO jako vstup
DDRB &= ~(1<<MISO);
// Povoleni SPI, SPI Master, LSB First, SPI CLK XTAL/16)
SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);
// nastaveni funkcniho registra SPI (SPCR), CPHA a CPOL v log 0
SPCR &= ~ (1<<CPOL);
SPCR &= ~ (1<<CPHA);
// CS HIGH protože SPI ADS je aktivní v 0
PORTB |= (1<<SS);
}
int main (void)
{
static unsigned int adc_value=0; // promenna AD prevodniku
lcd_init(LCD_DISP_ON); //inicializace LCD
spim_init(); // Inicializace SPI jako MASTER
for(;;){
adc_value = get_adc(0xFF); // získání hodnoty z AD prevodniku
lcd_gotoxy(0,1);
sprintf(buffer,"%d",adc_value);
lcd_puts(buffer);
}
}