Не люблю читать правила, но их соблюдаю!
Проблема в том-что с АЦП толком ничего считать не могу!
Подпрограмма обслуживания АЦП:
CODE
#include <avr/io.h>
#include <avr/delay.h>
#include "spi.c"
#include <string.h>
//Начальная инициализация АЦП:
//Сброс АЦП. 16 клоков
void adc_init(void)
{
SPI_MasterInit();
SPI_MasterTransmit(0xFF);
SPI_MasterTransmit(0xFF);
_delay_ms(1); //Пауза
//Настройка внутреностей
//IO REG
SPI_MasterTransmit(0b00101000); //28h
_delay_us(5);
SPI_MasterTransmit(0b00000000); //Опора отключенна
}
//Выбор канала АЦП:
void ADC_configure_chanel(unsigned char Ch)
//Ch - номер канала, от 1 до 2 - входы, 3 - внутрений датчик температуры
{
//Config REG
SPI_MasterTransmit(0b00010000); // 10h
_delay_us(5);
// ch Ch
// __ * ___ 0b0100111010010000
if (Ch==1) SPI_MasterTransmit(0b0000000000010000);//GAIN=32=39.06 V; Vbias=-AN1; ref=internal; buf=on
if (Ch==2) SPI_MasterTransmit(0b0000010100010000); //GAIN=32=78.125mV; Vbias=-AN2; ref=internal; buf=on
if (Ch==3) SPI_MasterTransmit(0b0100111110010110);//GAIN=1/6 ref=1.17V
_delay_us(5);
}
//Самокалибровка:
void ADC_Calibrate(void)
{
//Mode REG
SPI_MasterTransmit(0b00001000); //08h
_delay_us(5);
// 0b1000000000001111
SPI_MasterTransmit(0b1000000000000010); //Калибровка нуля
//Mode REG
SPI_MasterTransmit(0b00001000); //08h
_delay_us(5);
SPI_MasterTransmit(0b1010000000000010); //Калибровка шкалы
_delay_us(5);
}
//Запуск непрерывного преобразования:
void ADC_Start_Continuous_Conversion_Mode(void)
{
//Mode REG
SPI_MasterTransmit(0b00001000); //08h
_delay_us(5);
SPI_MasterTransmit(0b0000000000000010); //Cont. conv.
_delay_us(5);
}
//Чтение результатов преобразования из АЦП:
unsigned int adc_read(void)
{
//Читаем
//DATA REG
unsigned int adc1;
unsigned int adc2;
unsigned int adc;
SPI_MasterTransmit(0xFF);
SPI_MasterTransmit(0x58); //58h
_delay_us(5);
adc = SPDR;
SPI_MasterTransmit(0x00);
adc2 = SPDR;
adc <<= 8;
adc |= adc2;
return adc;
}
Вот на суд общественности еще и главную программу:
CODE
main(void)
{
char *text[6];
unsigned int n=0;
double adc;
lcd_init();
adc_init();
ADC_configure_chanel(1);
ADC_Calibrate();
ADC_Start_Continuous_Conversion_Mode();
while (1)
{
adc = 0;
for (n=1;n<=300;n++)
{
adc = adc + adc_read()*2.5/0xFFFF;
}
adc = adc/300;
dtostrf(adc,6,2,text);
lcd_send(COMMAND, LCD_CLEAR);
DDRD = (1 << 4);
lcd_write(text);
DDRD = 0x00;
}
}
Сообщение отредактировал IgorKossak - Dec 13 2011, 07:12
Причина редактирования: [codebox]