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

 
 
 
Reply to this topicStart new topic
> MCP3550
Jenya7
сообщение May 24 2012, 07:11
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Привет всем! Я хочу поработать с MCP3550.
Это 22-х битный АЦП с серийным выходом. По клоку он выдает биты наружу.
Вопрос как лучше с ним работать? Через SPI или написать простую функцию - в лупе 22 раза сгенерировать клок и записать дату с пина DOUT.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение May 24 2012, 17:07
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Странный вопрос. Как хотите, так и работаете. Вопросы вызывает только двухпроводный режим, когда CS железно в нуле. Что-то он у мну так и не заработал. smile3046.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 24 2012, 19:05
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(_Pasha @ May 24 2012, 23:07) *
Странный вопрос. Как хотите, так и работаете. Вопросы вызывает только двухпроводный режим, когда CS железно в нуле. Что-то он у мну так и не заработал. smile3046.gif


Вообще то я так и хотел работать в Continuous Conversion Mode когда CS на нуле. В принципе я могу и дергать ногу CS, не страшно.
А вопрос как мне кажется обычный. Опыта работы с внешним АЦП нет вот и спрашиваю более опытных товарищей.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 27 2012, 13:31
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Делаю так

CODE
#define CS PORTB_Bit0
#define SCK PORTB_Bit1
#define SDO PINB_Bit3

unsigned long GetADC(void)
{
unsigned long data = 0;
char i = 24;
CS = 0; //convertion start
while(SDO) //wait until convertion completed
{}
while(i)
{
SCK = 0; //data shifted on SCK falling edge
delay_ms(1);
data = data | (SDO << i);
SCK = 1;
i--;
}
CS = 1;
return data;
}

void main(void)
{
key = ScanKeypad();
if(key==7)
{
unsigned long adc_data = GetADC() & 0x3FFFFF; //get 22 bits
SendString(UnsignedIntegerToAscii(adc_data));
}
}


Потом по формуле
Код
vin = 5 * adc_data / 4194304UL;  //2^22 = 4194304

вычисляю входное напряжение. Получаю ошибочный результат.
Где я дурак?

Сообщение отредактировал IgorKossak - May 27 2012, 18:57
Причина редактирования: [codebox] для длинного кода
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 28th June 2025 - 18:28
Рейтинг@Mail.ru


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