Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

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 in LQFP64 package
  • ARM®32-bit Cortex®-M4 CPU with FPU
  • 100 MHz max CPU frequency
  • VDD from 1.7 V to 3.6 V
  • 512 KB Flash
  • 128 KB SRAM
  • GPIO (50) with external interrupt capability
  • 12-bit ADC with 16 channels
  • RTC
  • Timers (8)
  • I2C (3)
  • USART (3)
  • SPI (5)
  • USB OTG Full Speed
  • SDIO

Фотография платформы Nucleo-F411RE изображена на рисунке 1.

Написать программу для платформы Nucleo-F411RE я решил в Online-компиляторе mbed. Смотреть ссылку https://developer.mbed.org/

Схема подключения платформы изображена на рисунке 2.

Далее приведён листинг на С++:

#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/

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

Теги:

Опубликована: 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (0) | Я собрал (0) | Подписаться

Статью еще никто не комментировал. Вы можете стать первым.
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
Arduino UNO Мультиметр Mastech MS8239C
вверх