ЦАП и Arduino Uno

Skeep
Offline
Зарегистрирован: 30.05.2013

Подключаю к ардуино микрофон и оцифровую с него сигнал через встроеный ацп ардуино. Затем мне надо эту цифру передать на ЦАП через SPI. Подскажите като знает какой надо код. Сколько не пробовал на выходе ЦАПа нет сигнала.

__Alexander
Offline
Зарегистрирован: 24.10.2012

А сколько пробовали? Попробуйте еще пару раз, оно начинает работать после N-го количества пробований.

maksim
Offline
Зарегистрирован: 12.02.2012

Skeep пишет:

Подскажите като знает какой надо код.

Надо код, который получает данные с аналогового входа дуины и отправляет их на ЦАП по SPI.

int a = analogRead(0);
SPI.transfer(a>>8);
SPI.transfer(a&0xFF);

А вы мне не подскажите - у меня перегорела лампочка в машине, какую мне купить лампочку? с каким цоколем и какой мощности?

Skeep
Offline
Зарегистрирован: 30.05.2013

а что значит "a>>8" и "a&0xFF"

__Alexander
Offline
Зарегистрирован: 24.10.2012

похоже, кому-то рановато для цап и ацп.

Skeep
Offline
Зарегистрирован: 30.05.2013

И вообще из теории про SPI, после  SPI.begin(); на выходах SCK и MOSI низкий уровень, а на SS высокий, а у меня на MOSI высокий, может проблема в дуине? 

maksim
Offline
Зарегистрирован: 12.02.2012

Да не важно что это значит и не важно в чем проблема.

Давайте сначала разберемся с самой первой и главной проблемой - У меня на телефоне неправильная дата. Что бы ее исправить надо зайти в настройки телефона и исправить дату. Подскажите на какие мне нажать кнопки на моем телефоне, что бы изменить дату?

Skeep
Offline
Зарегистрирован: 30.05.2013

Arduino Uno. ЦАП DAC7611p

maksim
Offline
Зарегистрирован: 12.02.2012

Ну наконец-то! Опишите или покажите как подключаете.

Skeep
Offline
Зарегистрирован: 30.05.2013

Микрофон подключен к аналоговому входу 0. ЦАП: 3 ножка к 13 входу дуино, 4 ножка к 11 входу дуино, 5 ножка к 10 входу, 1 и 7 питание, 8 ножка выход.

maksim
Offline
Зарегистрирован: 12.02.2012

У этого ЦАПа не SPI, а 3-WIRE INTERFACE, а адаптировать аппаратным SPI не получится (99%), так как по даташиту отправлять нужно 12 бит. А значит нужно писать ручками функцию вывода данных в ЦАП.

Skeep
Offline
Зарегистрирован: 30.05.2013

а это большой код? вы не могли бы мне помочь? 

Skeep
Offline
Зарегистрирован: 30.05.2013

а если взять плату arduino due, на ней уже есть ЦАПы, и подавать сразу на те выходы цифру с микрофона, и подключить к наушникам, звук будет слышно? 

krikus
Offline
Зарегистрирован: 22.07.2011

Skeep пишет:

а если взять плату arduino due, на ней уже есть ЦАПы, и подавать сразу на те выходы цифру с микрофона, и подключить к наушникам, звук будет слышно? 

С этим проблем не будет.

void setup() {
//....
analogWrite(DAC0, 0); //Приводим ЦАП в готовность
analogReadResolution(12); //Приводим АЦП в готовность читать в 12бит режиме
}

int32_t var = 0;

void loop() {
var = analogRead(A0);
dacc_write_conversion_data(DACC_INTERFACE, var);
}

Я сам похожее делал.

Skeep
Offline
Зарегистрирован: 30.05.2013

а можно, пожалуйста, полностью код, а то я не знаю что должно быть ещё "//...."

maksim
Offline
Зарегистрирован: 12.02.2012

В даташите можно посмотреть расположение ног ЦАПа.

#define CLR 2
#define LD  3
#define CS  4
#define CLK 5
#define SDI 6


void setup() 
{
  pinMode(CLR, OUTPUT);
  pinMode(LD, OUTPUT);
  pinMode(CS, OUTPUT);
  pinMode(CLK, OUTPUT);
  pinMode(SDI, OUTPUT);
  digitalWrite(CS, 1);
  digitalWrite(LD, 1);
  digitalWrite(CLR, 0);
  delayMicroseconds(1);
  digitalWrite(CLR, 1);
}

void loop() 
{
  int sensorValue = analogRead(A0);
  WriteDAC(sensorValue);
  delay(1);
}

void WriteDAC(int val)
{
  digitalWrite(CS, 0);
  for(char i = 11; i >= 0; i--)
  {
    digitalWrite(SDI, ((1<<i)&val)?1:0);
    digitalWrite(CLK, 1);
    digitalWrite(CLK, 0);
  }
  digitalWrite(CS, 1);
  digitalWrite(LD, 0);
  delayMicroseconds(1);
  digitalWrite(LD, 1);
}

 

krikus
Offline
Зарегистрирован: 22.07.2011

 

Skeep пишет:

а можно, пожалуйста, полностью код, а то я не знаю что должно быть ещё "//...."

Это уже весь код. Единственное, насчет analogRead - сомневаюсь, может работать медленно. По идее, его можно заменить чем-то не из Ардуиновской библиотеки, как я это сделал с ЦАП-ом. Этот пример в любом случае будет работать... Я заменил analogWrite(DAC0, var) на dacc_write_conversion_data(DACC_INTERFACE, var);

UPD:Что-то со временем не совпало

maksim
Offline
Зарегистрирован: 12.02.2012

   

Skeep
Offline
Зарегистрирован: 30.05.2013

.

krikus
Offline
Зарегистрирован: 22.07.2011

/

Skeep
Offline
Зарегистрирован: 30.05.2013

не работает( 

maksim
Offline
Зарегистрирован: 12.02.2012

Что не работает? Рисуите схему как подключили или выкладывайте фото.

Skeep
Offline
Зарегистрирован: 30.05.2013

хотя вроде работает, дую на микрофон, напряжение на выходе цапа меняется, а в этом коде учтино что АЦП 10-битное, а цап 12-битный? там полученое значение надо на 4 домножить, где это надо дописать? 

maksim
Offline
Зарегистрирован: 12.02.2012

нет кончно,  WriteDAC(sensorValue*4);

Skeep
Offline
Зарегистрирован: 30.05.2013

всё работает!! спасибо большое. Прокоментируй каждую строчку кода если тебе не тяжело, очень надо для дальнейшей работы)

 

krikus
Offline
Зарегистрирован: 22.07.2011

maksim пишет:

нет кончно,  WriteDAC(sensorValue*4);

Может перегибаю палку, но WriteDAC(sensorValue<<2) будет немного быстрее(поправьте если не прав)... И вопрос: зачем в коде стоит delay(1)? - ЦАП - не успевает обрабатывать данные?

maksim
Offline
Зарегистрирован: 12.02.2012

Комментировать там нечего. Компилятор сам заменит *4 на <<2 да и о какой скорости может идти речь, если кругом одни digitalWrite'ы, а задержка просто так, что бы была.

Skeep
Offline
Зарегистрирован: 30.05.2013
digitalWrite(CS, 0);
32   for(char i = 11; i >= 0; i--)
33   {
34

    digitalWrite(SDI, ((1<<i)&val)?1:0);

Вот это пожалуйсто прокоментируйте 

maksim
Offline
Зарегистрирован: 12.02.2012

Это код

  digitalWrite(CS, 0);
  for(char i = 11; i >= 0; i--)
  {
    digitalWrite(SDI, ((1<<i)&val)?1:0);
    digitalWrite(CLK, 1);
    digitalWrite(CLK, 0);
  }
  digitalWrite(CS, 1);
  digitalWrite(LD, 0);
  delayMicroseconds(1);
  digitalWrite(LD, 1);

делает это

Skeep
Offline
Зарегистрирован: 30.05.2013

1<<i)&val)?1:0 

эти символы что делают) 

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

Skeep пишет:

а если взять плату arduino due, на ней уже есть ЦАПы, и подавать сразу на те выходы цифру с микрофона, и подключить к наушникам, звук будет слышно? 

это тоже самое, что стрелять из пушки по воробьям

зачем вам ARM, если у вас с простой мегой проблемы

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

Skeep пишет:

1<<i)&val)?1:0 

эти символы что делают) 

описанеи языка С почитайте...

на ножку выдается 1 если установлен соответствующий бит в переменной val

digitalWrite(SDI, ((1<<i)&val)?1:0); эту тоже самое что и

if ((1<<i)&val) digitalWrite(SDI,1) else digitalWrite(SDI,0);

 

Skeep
Offline
Зарегистрирован: 30.05.2013

Michal пишет:

Skeep пишет:

а если взять плату arduino due, на ней уже есть ЦАПы, и подавать сразу на те выходы цифру с микрофона, и подключить к наушникам, звук будет слышно? 

это тоже самое, что стрелять из пушки по воробьям

зачем вам ARM, если у вас с простой мегой проблемы

так а на Arduino due разве не получится? 

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

на том звере еще как получится, та даже 2 ЦАПа :)

Skeep
Offline
Зарегистрирован: 30.05.2013

Вот и славненько 

Спасибо всем за помощь!