Este artículo describe un procedimiento simple que le ayuda a introducir una amplia variedad de señales y funciones matemáticas en sus proyectos de microcontroladores.
Un microcontrolador de 25 o 50 MHz equipado con un convertidor analógico a digital y un convertidor digital a analógico no es en modo alguno incapaz de realizar tareas serias de procesamiento y generación de señales. Y, de hecho, las MCU deben reclutarse para aplicaciones DSP siempre que sea posible, porque son menos costosas y más fáciles de usar.
Aprenda a usar Scilab para facilitar la comunicación entre su PC y su código MCU y también modifique los datos.
Sin embargo, un posible obstáculo es la dificultad de incorporar las señales requeridas y las formas de onda matemáticas en el firmware. Me imagino que las suites de desarrollo de procesadores de señal digital de alta gama tienen herramientas sofisticadas que ayudan a los ingenieros a manejar este aspecto del diseño DSP, o tal vez los empleados que trabajan en empresas de ingeniería más grandes tienen una gran cantidad de código existente o archivos de datos desde los cuales pueden copiar y pegar.
En contraste, los microcontroladores a menudo van acompañados de herramientas de desarrollo que son entornos más básicos y profesionales que son … bueno, menos profesionales. Cuando diseñamos con MCU, a menudo tenemos que trabajar de manera más independiente y hacerlo con recursos limitados.
Este artículo analizará una técnica que puede hacer que su flujo de trabajo de procesamiento de señales basado en MCU sea mucho más fluido y satisfactorio. Más específicamente, le mostraré una forma de mover convenientemente los datos de forma de onda de una PC a un archivo de código de lenguaje C típico.
Primero, revisemos el formato básico que podemos usar para secuencias numéricas. Las señales y formas de onda se almacenarán como elementos en una matriz, y podemos inicializar una matriz con los valores numéricos requeridos de la siguiente manera:
Señal de char sin firmar[100] = {Value1, Value2, Value3, ..., Value99, Value100};
Por ejemplo, un ciclo de onda sinusoidal de 20 elementos se vería así:
Señal de char sin firmar[20] = {0.000, 0.309, 0.588, 0.809, 0.951, 1.000, 0.951, 0.809, 0.588, 0.309, 0.000, -0.309, -0.588, -0.809, -0.951, -1.000, -0.951, -0.809, -0.588, -0.309 };
Así es como se ven los valores numéricos de la señal en forma visual:
Nuestro objetivo aquí es cambiar fácilmente los números dentro de las llaves. Los números mismos provendrán de una PC y podrían ser datos de sensores, datos generados matemáticamente, datos medidos que han sido procesados por un filtro y cosas de esa naturaleza. Queremos cerrar la brecha entre el código del microcontrolador, que en realidad es solo un archivo de texto, y la PC, que tiene una interfaz de usuario conveniente y abundantes recursos de procesamiento.
Antes de continuar, quiero señalar un consejo relacionado: a menudo es una buena idea almacenar este tipo de matrices en la memoria de código. Esto le permite almacenar cantidades relativamente grandes de datos DSP sin consumir todos sus recursos de RAM. Por favor refiérase a [[this previous tips and tricks article]]para más información.
En este artículo, usaré Scilab como mediador entre la PC y el código MCU. Se podría utilizar otro software (MATLAB, Excel, etc.), pero Scilab es una buena opción porque es gratuito, potente y bastante intuitivo. El primer paso es llevar sus datos a una matriz Scilab. Puede importar datos de un archivo o generarlos utilizando las funciones matemáticas de Scilab. (Este sitio web de digitalizador de tramas puede ser útil; nunca lo he usado, así que no estoy seguro).
También es posible ingresar datos manualmente, ya sea escribiendo o copiando y pegando, en una representación de hoja de cálculo de la matriz; por ejemplo:
Si desea modificar los datos, aplique un filtro FIR para eliminar el ruido, aumente la amplitud, cambie la frecuencia de muestreo, etc., ahora es el momento. Cuando los datos están listos para formar parte del firmware del microcontrolador, el paso final es generar un archivo de texto desde el que pueda copiar fácilmente los valores y luego pegarlos en el archivo de código.
Para hacer esto, utilizaremos la función csvWrite () de Scilab.
Aquí hay un ejemplo:
filename = archivo completo (TMPDIR, "data.txt"); csvWrite (SineWaveCycle, nombre de archivo, ",", ".", "% .3f");
El comando fullfile () crea un archivo "data.txt" en un directorio que puede encontrar haciendo doble clic en la variable "nombre de archivo" en el Navegador de variables:
El primer argumento en la función csvWrite es el nombre de la matriz que contiene los datos. El siguiente es el nombre del archivo. El tercer argumento especifica los caracteres que separarán los valores de los datos; el valor predeterminado es una coma, pero por motivos estéticos lo cambié a una coma seguida de un espacio. El cuarto argumento en mi comando csvWrite le dice a Scilab que use un punto (en lugar de una coma) para la marca decimal, y el quinto argumento especifica una precisión de tres decimales.
Aquí está el resultado:
0.000, 0.309, 0.588, 0.809, 0.951, 1.000, 0.951, 0.809, 0.588, 0.309, 0.000, -0.309, -0.588, -0.809, -0.951, -1.000, -0.951, -0.809, -0.588, -0.309
Ahora todo lo que necesita hacer es copiar todo esto y pegarlo entre los corchetes de inicialización de matriz en el archivo de código. Siempre que necesite modificar los datos, simplemente cierre el archivo de texto, use el mismo comando cvsWrite, abra el archivo y copie y pegue.
Espero que hayas disfrutado esta sencilla técnica de desarrollo de firmware y que te resulte útil. Siéntete libre de dejar un comentario si tienes algún consejo relacionado que te gustaría compartir.
ga('create', 'UA-1454132-1', 'auto'); ga('require', 'GTM-MMWSMVL'); ga('require', 'displayfeatures'); ga('set',{'dimension1':'embedded,computing,analog,digital-ics,embedded,test-and-measurement,engineering-consulting'}); ga('set',{'contentGroup1':'embedded,computing,analog,digital-ics,embedded,test-and-measurement,engineering-consulting'});
ga('set',{'dimension3':"September 19, 2019"});
ga('set',{'dimension4':"Robert Keim"});
ga('send', 'pageview');
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n; n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window, document,'script','https://connect.facebook.net/en_US/fbevents.js'); fbq('init', '1808435332737507'); // Insert your pixel ID here. fbq('track', 'PageView'); fbq('track', 'ViewContent', { content_ids: ['embedded','computing','analog','digital-ics','embedded','test-and-measurement','engineering-consulting'], content_type: 'category'});
_linkedin_data_partner_id = "353081"; (function(){var s = document.getElementsByTagName("script")[0]; var b = document.createElement("script"); b.type = "text/javascript";b.async = true; b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js"; s.parentNode.insertBefore(b, s);})(); } if(jstz.determine().name().indexOf("Europe") === -1) { showSocialCode(); // NOT EU } else { showSocialCode(); window.addEventListener("load", function () { window.cookieconsent.initialise({ "palette": { "popup": { "background": "#252e39" }, "button": { "background": "#14a7d0" } }, "type": "opt-out", "content": { "message": "This website uses tracking cookies to ensure you get the best experience on our website.", "href": "https://www.allaboutcircuits.com/privacy-policy/", "dismiss": "OK, GOT IT" }, onInitialise: function (status) { var type = this.options.type; var didConsent = this.hasConsented(); if (type == 'opt-out' && didConsent) { console.log("eu"); //showSocialCode(); } },
onStatusChange: function (status, chosenBefore) { var type = this.options.type; var didConsent = this.hasConsented(); if (type == 'opt-out' && didConsent) { console.log("eu"); //showSocialCode(); } },
onRevokeChoice: function () { var type = this.options.type; if (type == 'opt-out') { console.log("eu"); //showSocialCode(); } },
}) }); }
Los días felices de la PDA y Blackberry han quedado definitivamente atrás, pero el factor…
Tutorial sobre cómo pronosticar usando un modelo autorregresivo en PythonFoto de Aron Visuals en UnsplashForecasting…
Si tienes un iPhone, los AirPods Pro son la opción obvia para escuchar música, ¡aunque…
Ilustración de Alex Castro / The Verge Plus nuevos rumores sobre el quinto Galaxy Fold.…
Se rumorea que los auriculares premium de próxima generación de Apple, los AirPods Max 2,…
El desarrollador Motive Studio y el editor EA han lanzado un nuevo tráiler de la…