STM32F103C8 Внешний ЦАП

STM32USER
Пн 15 января 2018 12:54
Привет

Я хочу использовать внешний ЦАП в STM32F103C8.

Как я могу получить значение 0-255 как 8 логических выводов.

Thax :рулон:

Пито
Пн 15 января 2018 г., 13:02
Какой внешний ЦАП, дайте нам ссылку..

STM32USER
Пн 15 января 2018 г. 13:11
[Пито - Пн 15 января 2018 г. 13:02] - Какой внешний ЦАП, дайте нам ссылку..
У меня нет схемы.

Например, PA0 PA1 PA2 PA3 PA4 PA5 PA6 Я могу получить 8 выходов с для данных 0-255.

или если выходы разные

PA0, PA1, PB2, PB5 и т. Д.

Пито
Пн 15 января 2018 г., 13:52
С 103C8 вы можете использовать
analogWrite(pin, value); // value 0 - 255 analogWrite(PA7, 189); or pwmWrite(pin value); // value 0 - 65535

Дэнниф
Пн 15 января 2018 г. 13:58
Как я могу получить значение 0-255 как 8 логических выводов. Как правило, вы пишете кусок кода, согласно таблицу вашего внешнего ЦАП, чтобы общаться с ним.

Это работает 100% времени со 100% устройств, ЦАП или нет.

Пито
Пн 15 января 2018 г. 14:06
Будьте более конкретны, какой внешний ЦАП вы хотите использовать (если есть)?
Есть R2R ЦАП, 1-2-4-8..R DACS, I2C ЦАП, SPI DACS, PARALLEL DAC, ШИМ ЦАП и т. Д..

STM32USER
Пн 15 января 2018 г. 14:14
Изображение


Можем ли мы сделать это как картина?

Пито
Пн 15 января 2018 г. 14:16
Это ЦАП R2R.
Да, вы можете сделать это, конечно. Вы можете подключить его к порту, т.е. Porta или Portb, PA0-PA7 или PB0-PB7, а затем отправьте значение DAC в Porta или PortB за одну запись.
Имейте в виду, STM32 - 3.3 -вольтное устройство, таким образом, выход R2R будет 0..3.28 В макс.

STM32USER
Пн 15 января 2018 г. 14:34
Спасибо за ответ, если я хочу использовать разные булавки?

PA0, PA1, PA2, PB12, PB13, PB14, PA3 и т. Д.

Есть метод

Пито
Пн 15 января 2018 г. 14:48
Вы можете установить биты индивидуально. Сначала установите отдельные булавки на выходы, затем напишите Dacvalue:
pinMode(PA0, OUTPUT); .. pinMode(PB12, OUTPUT); .. // write the DACvalue 0-255, 8bit digitalWrite(PA4, (DACvalue & 0x80)); // the highest DACvalue bit7 digitalWrite(PA3, (DACvalue & 0x40)); digitalWrite(PB14, (DACvalue & 0x20)); digitalWrite(PB13, (DACvalue & 0x10)); digitalWrite(PB12, (DACvalue & 0x08)); digitalWrite(PA2, (DACvalue & 0x04)); digitalWrite(PA1, (DACvalue & 0x02)); digitalWrite(PA0, (DACvalue & 0x01)); // the lowest DACvalue bit0 ..

Вассилис
Пн 15 января 2018 г. 15:49
ЦАП R2R требует эксплуатационного усилителя (OP_AMP) для получения некоторого Mα до вывода. Например, вы можете нет водить светодиод с ЦАП R2R AS-IS. Вам нужно использовать Op-AMP, такой как LMV358.

Если бы я был вами, я бы использовал DAC SPI, такой как MCP4921 (одиночный DAC) или MCP4922 (двойной ЦАП), которые могут обеспечить выход 25 мА как есть ;)

Дэнниф
Пн 15 января 2018 г., 17:18
Вы можете установить биты индивидуально. Просто подумайте о значениях, которые выводят DAC, пока эти контакты устанавливаются / сброшены.

Вам понадобится механизм для защелки.

Пито
Пн 15 января 2018 г., 18:00
Он может применить алгоритм, где биты между образцами ЦАП изменяют такую ​​суматоху на выходе :)

Стивестронг
Пн 15 января 2018 г., 18:39
Какая конечная цель?
Не может быть решено с помощью отфильтрованного вывода ШИМ?

Дэнниф
Пн 15 января 2018 г., 23:18
Он может применить алгоритм Я не знаю, как это можно решить с помощью программного обеспечения. Защелка, в том числе регистр смены, оснащенные защелкой, будет моим способом перейти на выход без глюка. В противном случае конденсатор может помочь уменьшить глюки, однако с собственными проблемами с производительностью.

STM32USER
Вт 16 января 2018 г. 15:09
uint8_t DPINS[] = {PA0, PB0, PA1, PB0, PB12, PB13, PB14, PB15}; // random pin void setup(){ for (uint8_t i = 0; i <= sizeof(DPINS) - 1; i++) pinMode(DPINS[i], OUTPUT); } num = sine[i]; // sine table value for (byte i=0; i<= sizeof(DPINS) - 1; i++) { byte state = bitRead(num, i); digitalWrite(DPINS[i], state); }

Вассилис
Вт 16 января 2018 г., 17:33
Попробуйте этот код
uint8_t DPINS[] = {PA0, PB0, PA1, PB1, PB12, PB13, PB14, PB15}; // random pin uint8_t num; uint8_t sine[256] = { 0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96, 0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE, 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4, 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD8, 0xDA, 0xDC, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xF5, 0xF4, 0xF3, 0xF1, 0xF0, 0xEF, 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xC4, 0xC1, 0xBF, 0xBC, 0xB9, 0xB6, 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A, 0x77, 0x74, 0x70, 0x6D, 0x6A, 0x67, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x52, 0x4F, 0x4D, 0x4A, 0x47, 0x44, 0x41, 0x3F, 0x3C, 0x39, 0x37, 0x34, 0x32, 0x2F, 0x2D, 0x2B, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18, 0x16, 0x15, 0x13, 0x11, 0x10, 0x0F, 0x0D, 0x0C, 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64, 0x67, 0x6A, 0x6D, 0x70, 0x74, 0x77, 0x7A, 0x7D }; void setup(){ for (uint8_t i = 0; i <= sizeof(DPINS) - 1; i++) pinMode(DPINS[i], OUTPUT); } void loop() { for(int m=0;m<255;m++){ num = sine[m]; // sine table value for (byte i=0; i <= sizeof(DPINS)-1; i++) { byte state = bitRead(num, i); digitalWrite(DPINS[i], state); } } }

Пито
Вт 16 января 2018 г. 22:47
Попробуйте заказать изменение битов Dacvalue с самого высокого до самого низкого (как я это делал в коде выше).
Как в вашем коде: for (byte i=7; i >=0; i--) { byte state = bitRead(num, i); digitalWrite(DPINS[i], state); }

Дэнниф
Ср 17 января 2018 г. 13:50
Если вы хотите скорость, не используйте DigitalWrite, разверните петлю и используйте указатель, чтобы индексировать массив.

Пито
Ср 17 января 2018 г. 14:19
Самым быстрым способом было бы сгенерировать набор DAC «Команды», как .. sample_delay(); // *********************** Output the Sample N. 345 ************************ //Set A2, A12, A13 (HIGH) GPIOA->regs->BSRR = 0b0011000000000100; //Clear A3, A11, A15 (LOW) GPIOA->regs->BRR = 0b1000100000001000; //Set B1, B12, B15 (HIGH) GPIOB->regs->BSRR = 0b1001000000000010; //Clear B3, B11, B13 (LOW) GPIOB->regs->BRR = 0b0010100000001000; // ************************************************************************* sample_delay(); ..

Racemaniac
Ср 17 января 2018 г., 14:20
Напоминает мне о моей первой итерации светового меча, я пошел на аналогичную установку на то, что здесь пытается ОП. Но я выбрал последовательные булавки (например, PA0 -> PA7), поэтому я мог бы написать непосредственно в портовые регистры с моими двоичными данными, делая его очень быстро :).
Вместо того, чтобы на самом деле построить свою собственную лестницу R2R, я использовал IC, который в основном состоит из такой лестницы, а затем 2 ампер, чтобы получить звук от всего этого :).

Пито
Ср 17 января 2018 г. 14:39
Вы можете написать образец ЦАП R2R в 4 часах (~ 56NS) с любыми булавками на Porta и Portb (т.е. до 32 -битного R2R) - см. Мой предыдущий пост.. :)
Требуется написать эскиз для генерации последовательности «исходного кода» образца DAC (написание эскиза остается в качестве упражнения для OP)..

Вассилис
Сб 03 февраля 2018 г. 15:39
Пример наброска для использования 12-битного DAC MCP4921
ViewTopic.PHP?F = 18&T = 3187&P = 40871#P40871