реклама на сайте
подробности

 
 
> Подключил АЦП MCP3208. Работает., Учитывая что задавал много вопросов...
Димон Безпарольн...
сообщение Mar 19 2014, 08:04
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Учитывая что задавал много вопросов хочу выложить. Мож кому пригодится. А может кто и покритикует.
SPI программный. Аппаратный не дает возможности одновременного чтения - записи.

Инициализирую SPI:
Цитата
void INITSPI(void){
ebdat6_08pinConfigureToUnused(FL_PIN_41); //SCK
ebdat6_08pinConfigureToUnused(FL_PIN_42); //SS
ebdat6_08pinConfigureToUnused(FL_PIN_43); //MOSI
ebdat6_08pinConfigureToUnused(FL_PIN_44); //MISO
ebdat6_02GpioSubscribe(FL_PIN_41, FL_GPIO_OUTPUT, 1) ; //SCK
ebdat6_02GpioSubscribe(FL_PIN_42, FL_GPIO_OUTPUT, 1) ; //SS
ebdat6_02GpioSubscribe(FL_PIN_43, FL_GPIO_OUTPUT, 1) ; //MOSI
ebdat6_02GpioSubscribe(FL_PIN_44, FL_GPIO_INPUT, 1) ; //MISO
}


Прием / запись SPI. На основе найденного на этом форуме кода:
Цитата
u8 SEND_READ_BYTE(u8 bt)//Data is always output from the device on the falling edge of the clock MCP3208
{u8 a,dats=0;
bool mBits;
for(a=0;a<8;a++)
{
if(bt&0x80)while(ebdat6_04WriteGpio(FL_PIN_43,1)!=FL_OK); //Если передаваемый бит = 1
else while(ebdat6_04WriteGpio(FL_PIN_43,0)!=FL_OK); //Если передаваемый бит = 0
while(ebdat6_04WriteGpio(FL_PIN_41, 0)!=FL_OK);
dats<<=1; //Буфер приема
bt<<=1; //Байт для передачи
while(ebdat6_05ReadGpio(FL_PIN_44,&mBits)!=FL_OK); //Читаем состояние вывода в mBits из MISO
if(mBits)dats|=1; //Если mBits = 1, пишем 1
while(ebdat6_04WriteGpio(FL_PIN_41, 1)!=FL_OK);
}
return dats;
}


Чтение АЦП, преобразование во float:
Цитата
float ADCRead (char Channel) { //Чтение АЦП и преобразование во float
#define F 4.075/4095 //Множитель для преобразования во float
float FR;
unsigned int adc; //
unsigned char ADCL, ADCH; //
Channel = Channel & 0x7; //Номер канала - младшие 3 бита.
Channel = Channel <<2; //
while(ebdat6_04WriteGpio(FL_PIN_42,0)!=FL_OK);//Сбросить CS в 0
ADCL = SEND_READ_BYTE(0x60|Channel); //Стартовый бит(7), дифф. бит(6), биты номера канала(5,4,3)
ADCH = SEND_READ_BYTE(0x0); //В ADCH помещаются биты 11-4
ADCL = SEND_READ_BYTE(0x0); //В ADCL помещаются биты 3-0 в старший ниббл!
while(ebdat6_04WriteGpio(FL_PIN_42,1)!=FL_OK);//Установить CS в 1
ADCL = ADCL & 0Xf0; //Нужная информация в старшем ниббле
adc = ((ADCL)|((ADCH)<<8)); //Преобразование в INT
adc = (adc >>4); //Выравнивание по правому краю
FR= (((float)adc)*F); //Преобразование во Float
return FR;} //Возвращаем Float.


И наконец - тест восмиканального АЦП:

Цитата
void TestADC (void) {
char buf[20];
float FR;
unsigned char i;
unsigned char j;
for(j=0; j<8; j++)
{FR=ADCRead(j);
i=sprintf(buf, "%d %f\r\n",j, FR);
ebdat9_02SendToSerialPort(buf, i);}
}


Сообщение отредактировал Димон Безпарольный - Mar 19 2014, 08:06
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 04:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01339 секунд с 7
ELECTRONIX ©2004-2016