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/

Прикреплені файли:

Top