Nucleo-F411RE USB-ADC
В цій статті я хочу поділитися з Вами своїм досвідом створення комп'ютерної периферії за доступні гроші. За основу свого 6-канального АЦП я взяв платформу Nucleo-F411RE. Варто віддати належне платформам ST microelectronics, які можна купити в українських магазинах радіотоварів за доступною ціною. Залишається написати програми для платформи Nucleo-F411RE на C++ та програмне забезпечення на Visual C#. Перед собою я поставив наступну мету.
Мета
Виміряти з точністю до 1 мВ в діапазоні 0..3,3 В напругу на 6 аналогових входах мікроконтролера (варто зазначити, що платформа перетворює напругу USB з 5 В до 3,3 В з похибкою). Передати інформацію на персональний комп'ютер для відображення напруг на графіку. Дискретність вимірювання за часом 1 секунда.
Комп'ютерна периферія
- STM32F411RET6 в LQFP64 пакуванні
- ARM®32-біт Cortex®-M4 ЦПУ з FPU
- Максимальна частота ЦПУ 100 МГц
- VDD від 1.7 В до 3.6 В
- 512 КБ Flash
- 128 КБ SRAM
- GPIO (50) з можливістю зовнішнього переривання
- 12-бітний АЦП з 16 каналами
- RTC
- Таймери (8)
- I2C (3)
- USART (3)
- SPI (5)
- USB OTG Full Speed
- SDIO
Фотографія платформи Nucleo-F411RE зображена на малюнку 1.
Написати програму для платформи Nucleo-F411RE я вирішив в Online-компиляторі mbed. Дивіться посилання https://developer.mbed.org/
Схема підключення платформи зображена на малюнку 2.
Далі наведено листинг на C++:
#include "mbed.h" Serial pc(USBTX, USBRX); AnalogIn av0(A0); AnalogIn av1(A1); AnalogIn av2(A2); AnalogIn av3(A3); AnalogIn av4(A4); AnalogIn av5(A5); DigitalOut led(LED1); float v, vl; int w; static int ConvertH(float v){ w=0; if(v>2047) {v=v-2048;w=w+16;} if(v>1023) {v=v-1024;w=w+8;} if(v>511) {v=v-512;w=w+4;} if(v>255) {v=v-256;w=w+2;} if(v>127) {v=v-128;w=w+1;} vl=v; return w;} int main() { while(1) { led=!led; wait(1); v= av0.read(); v = v * 3300; pc.putc((char)ConvertH(v)); pc.putc((char)vl); v = av1.read(); v = v * 3300; pc.putc((char)ConvertH(v)); pc.putc((char)vl); v= av2.read(); v = v * 3300; pc.putc((char)ConvertH(v)); pc.putc((char)vl); v = av3.read(); v = v * 3300; pc.putc((char)ConvertH(v)); pc.putc((char)vl); v = av4.read(); v = v * 3300; pc.putc((char)ConvertH(v)); pc.putc((char)vl); v = av5.read(); v = v * 3300; pc.putc((char)ConvertH(v)); pc.putc((char)vl); } }
На малюнку 3 показано скріншот компілятора.
Прилад підключається до комп'ютера через USB-порт. Пристрій емулює COM-порт. Через USB-UART інтерфейс здійснюється робота з мікроконтролером. У платформі є дві кнопки для скидання мікроконтролера та для управління приладом. Кнопка управління приладом не реалізується.
Програмне забезпечення
Підключивши платформу до персонального комп'ютера, встановіть необхідні драйвера, дивіться посилання http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/LN1847/PF260320?s_searchtype=keyword. Скриншот дивіться на малюнку 4.
Тепер у пам'ять платформи можна скопіювати файл adc_NUCLEO_F411RE. Скриншот Flash-пам'яті платформи Nucleo-F411RE зображений на малюнку 5.
Після того як драйвера встановлені, дізнайтеся, який COM-порт розпізнано для даної платформи. Дивіться малюнок 6, де зображено скріншот.
Листинг програмного забезпечення на Visual C# дивіться нижче:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int sec; private void timer1_Tick(object sender, EventArgs e) { int v0H,v0L,v0; v0H = serialPort1.ReadByte(); v0L = serialPort1.ReadByte(); v0 = 128 * v0H + v0L; label1.Text = "ADC0=" + v0.ToString() + "mV"; int v1H,v1L,v1; v1H = serialPort1.ReadByte(); v1L = serialPort1.ReadByte(); v1 = 128 * v1H + v1L; label2.Text = "ADC1=" + v1.ToString() + "mV"; int v2H, v2L, v2; v2H = serialPort1.ReadByte(); v2L = serialPort1.ReadByte(); v2 = 128 * v2H + v2L; label3.Text = "ADC2=" + v2.ToString() + "mV"; int v3H, v3L, v3; v3H = serialPort1.ReadByte(); v3L = serialPort1.ReadByte(); v3 = 128 * v3H + v3L; label4.Text = "ADC3=" + v3.ToString() + "mV"; int v4H, v4L, v4; v4H = serialPort1.ReadByte(); v4L = serialPort1.ReadByte(); v4 = 128 * v4H + v4L; label5.Text = "ADC4=" + v4.ToString() + "mV"; int v5H, v5L, v5; v5H = serialPort1.ReadByte(); v5L = serialPort1.ReadByte(); v5 = 128 * v5H + v5L; label6.Text = "ADC5="+v5.ToString()+"mV"; chart1.Series[0].Points.AddXY(sec,v0); chart1.Series[1].Points.AddXY(sec, v1); chart1.Series[2].Points.AddXY(sec, v2); chart1.Series[3].Points.AddXY(sec, v3); chart1.Series[4].Points.AddXY(sec, v4); chart1.Series[5].Points.AddXY(sec, v5); sec++; } int z = 0; private void button1_Click(object sender, EventArgs e) { if (z == 0) { serialPort1.PortName = comboBox1.Text; serialPort1.Open(); timer1.Enabled = true; button1.Text = "Disconnect"; z++; } else { timer1.Enabled = false; serialPort1.Close(); button1.Text = "Connect"; z = 0; } } private void checkBox1_CheckedChanged(object sender, EventArgs e) { } private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { } private void label1_Click(object sender, EventArgs e) { } private void button2_Click(object sender, EventArgs e) { sec = 0; chart1.Series[0].Points.Clear(); chart1.Series[1].Points.Clear(); chart1.Series[2].Points.Clear(); chart1.Series[3].Points.Clear(); chart1.Series[4].Points.Clear(); chart1.Series[5].Points.Clear(); } } }
Дивіться скріншот програмного забезпечення на малюнку 7.
У програмному забезпеченні виберіть відповідний COM-порт і натисніть кнопку «Connect». Замигає зелений світлодіод LD2 на платформі Nucleo-F411RE – почнеться вимірювання напруги та обмін даними між платформою та комп'ютером. На графіку будуть відображені 6 напруг з дискретністю в 1 секунду. Для очищення графіка натисніть кнопку «Clear».
Якщо вимірювати напруги немає сенсу, натисніть на кнопку «Disconnect». І витягніть USB-вилку з персонального комп'ютера.
Посилання в інтернеті
http://www.st.com/
https://developer.mbed.org/
Прикреплені файли:
- AYK_cpp.zip (1 Кб)
- AYK_adc_NUCLEO_F411RE.zip (11 Кб)
- AYK_USB-ADC6.zip (74 Кб)