Ви не увійшли.
Сторінки 1
Добрый день. Если я правильно понял, то вам с помощью 12bit ЦАП нужно вывести 256 значений, т.е. 8bit. Это можно сделать с помощью порта B или D МК ATmega32U4. Но, поскольку, МК распаян под ардуино так, что полный порт выделить нельзя, то используйте два порта по 4 бита в каждом. Удобнее всего, согласно схеме, использовать половину порта F (PF4...PF7) и половину порта D (PD0...PD3). Так вот, берёте ваше 8bit число Z, делите его на две части по 4bit, получаете два числа: Х и Y. Далее записываете в оба порта соответствующие числа командой PORT: Например PORTF=X, PORTD=Y. К пинам соответствующих портов подключаете ваш ЦАП. Таким образом, изменяя Z от 0 до 256 автоматически получите необходимое значение напряжения на выходе ЦАП.
самая главная проблема в том, что схема собиралась без меня и там уже все припаяно, по факту у меня есть табличка что с чем соединено, но когда я пытаюсь получить максимальное значение напряжения на выходе ЦАПа - получаю 2,3В вместо 2,5В, может это и не большая ошибка, но вот с остальными значениями вообще муть какая-то, вроде меняю самые значащие разряды, а изменения настолько незначительны, что без понятия что с ними сделать. И еще, заметила небольшую ошибку среди кучи своих:
PORTB = B01111110;
PORTD = B00011111;
PORTC = B01000000;
как писалось ранее, оказывается портБ отвечает за 0-7 цифр. пины, а не по бокам микросхемки(как мне хотелось бы), а некоторые подключенные у меня порты не описаны через функцию порт(Б,Ц,Д), так что, вероятнее всего, я теряю несколько цифр, что очень больно бьет по результатам .____.
На счет уточнений про 8бит, у меня есть 12 проводов от ардуины к ЦАПу и все числа, которые мне следует передавать содержат 12 знаков, 256 значений - это моя синусоида достаточно мало значений, чтобы в случае чего сделать все "руками", а не средствами ардуино, которую я, честно говоря, уже и не сильно надеюсь увидеть на осциллографе, но время поджимает и я хочу хотя бы понять что я делаю не так.
И еще, мало ли кто сталкивался с функцией bitRead - подскажите как она работает на примерах, вдруг я не правильно ее использую.
Добрый день, от безысходности приходиться обращаться на форум и искать помощи среди тех, кто понимает хоть что-то в Ардуинах.
Дело следующее: есть Ардуин Про Микро (на Атмеге32у4), оно подключено к ЦАПу через все возможные цифровые выходы, в среде разработки я прописываю какие пины Атмеги будут выводить данные и т.д., но тут начинаются проблемы, в чем конкретно - не могу знать, но есть догадки, что либо я не правильно использую bitRead(), digitalWrite(), либо Ардуина не понимает чего от нее хотят. Конкретнее - у меня есть 12-разрядный ЦАП, который из поданных ему единиц и нулей формирует напряжение на выходе, есть зависимость кода от напряжения - в прочем, ничего нового. Так вот, когда дело подходит к перебиранию бинарных значений - напряжение отказывается принимать нужные значения и изменяется еле заметно, хотя я меняю самые значащие разряды. Если же в тупую прописать
PORTB = B01111110;
PORTD = B00011111;
PORTC = B01000000;
то схемка вроде выдает что-то подобное максимальному возможному значению напряжения. Однако у меня есть 256 значений и перебирать все этим способом времени и сил не хватит.
Примерно так я пыталась осуществить подачу единиц и нулей на ЦАП:
int pin_mass [12] = {9,10,11,28,29,30,18,19,20,21,25,31};
int i;
int j;
int mass [1] = {111111111111}; // наш массив значений синуса (для начала охота разобраться хотя бы с одним числом)
void setup()
{
DDRB = B01111110; //делаем все порты выходными
DDRD = B00011111;
DDRC = B01000000;
pinMode(1, OUTPUT);
}
void loop()
{
i=0;
while(i<1) // попытки получить результат хотя бы из одного значения (массив mass реализует максимальное значение напряжения, но на вольтметре все те же 1,92)
{
digitalWrite(1, HIGH); // подаем на ножку WR ЦАПа 5 вольт
delayMicroseconds(10);
start();
i++;
digitalWrite(1, LOW);
delayMicroseconds(60);
}
}
void start()
{
j=0;
while(j<=11)
{
if(bitRead(mass[i], j) == 1) //проверяем "j-ый" бит указанного значения нашего массива
{
digitalWrite(pin_mass [j], HIGH); // по сути это должен быть как раз вывод на определенный пин единицы, если это она
}
else
{
digitalWrite(pin_mass [j], LOW); // или нуля
}
j++;
}
}
Знакомые рассказывали, что поочередная передача каждого из 12ти значений на определенный порт была бы намного легче, если бы в Ардуине было нечто схожее с ПИКом, где переменная "статус" запоминает число перед тем, как его "сдвигают", но увы слишком поздно менять установку и я все еще лелею надежды повторить подобное на своей схеме.
В общем, было бы замечательно, если кто-то подскажет что в этой ситуации можно сделать, но даже замечание правильно ли я использую вышеперечисленные функции - было бы уже огромным подарком.
Сторінки 1