Mudanças entre as edições de "Sensores"
Ir para navegação
Ir para pesquisar
(→Código) |
(→Código) |
||
Linha 1: | Linha 1: | ||
+ | |||
+ | ====ATUAL==== | ||
+ | ;Aula 30 (30 Nov): | ||
+ | *Apresentação do projeto Final | ||
+ | :* Descrição do projeto '''AE5 - Projeto de um Detector de DTMF''' | ||
+ | |||
+ | :* Estudar os blocos do Simulink: [https://www.mathworks.com/help/dsp/ref/timescope.html Time Scope], [https://www.mathworks.com/help/dsp/ref/spectrumanalyzer.html Spectrum Analyzer], [https://www.mathworks.com/help/dsp/ref/sinewave.html Sine Wave], [https://www.mathworks.com/help/dsp/ref/chirp.html Chirp], [https://www.mathworks.com/help/dsp/ref/randomsource.html Random Source], [https://www.mathworks.com/help/dsp/ref/signalfromworkspace.html Signal From Workspace], [https://www.mathworks.com/help/dsp/ref/frommultimediafile.html From Multimedia File]. | ||
+ | |||
+ | ;Aula 31 a 33 (4 Dez): | ||
+ | * Aula de projeto (implementação da AE5) | ||
+ | |||
+ | |||
+ | ;Aula 34 (14 Dez): | ||
+ | :*Uso do HDL Coder | ||
+ | ::* [http://www.mathworks.com/help/hdlcoder/hdl-code-generation-from-simulink.html HDL Code Generation from Simulink] | ||
+ | ::* [http://www.mathworks.com/help/hdlcoder/simulink.html Simulink® blocks supported for HDL code generation] | ||
+ | |||
+ | :* Exemplo simples. | ||
+ | ::* Inicialmente construa a biblioteca de blocos suportados pelo HDLcoder | ||
+ | hdllib [http://www.mathworks.com/help/hdlcoder/ug/show-blocks-supported-for-hdl-code-generation.html Show Blocks Supported for HDL Code Generation] | ||
+ | |||
+ | ::*Construa o modelo mostrado na figura abaixo. (sugestão de frequência do sinal de 100Hz, e frequência de amostragem deve ser de 1000Hz) | ||
+ | <center> | ||
+ | [[Arquivo:teste_sin_HDLcoder.png | 600 px]] | ||
+ | </center> | ||
+ | ::*coloque o modelo em um subsistema e conecte a saída a um '''Time Scope''' | ||
+ | <center> | ||
+ | [[Arquivo:subsistema_teste_sin_HDLcoder.png | 300 px]] | ||
+ | </center> | ||
+ | ::*Salve o modelo como teste_sin_HDLcoder, e em seguida faça o ajuste automático das configurações usando o comando. | ||
+ | hdlsetup('teste_sin_HDLcoder') | ||
+ | ::* Execute o HDLcoder | ||
+ | ::* Siga o fluxo do HDLcoder passo a passo e corrija eventuais problemas conforme indicado nas mensagens de ERRO. | ||
+ | :::* Será necessário mudar o tipo de dado do bloco seno e constante para fix(16). | ||
+ | ::* Após ter concluído com sucesso o fluxo de codificação HDL, vá até a pasta onde os arquivos VHDL foram gerados e observe que devem ser sido gerados os seguintes arquivos (Subsystem_tb_pkg.vhd Subsystem_tb.vhd Subsystem.vhd) na pasta | ||
+ | cd hdl_prj/hdlsrc/teste_sin_HDLcoder | ||
+ | ls *.vhd | ||
+ | |||
+ | ::* Use o ModelSim para compilar os arquivos e em seguida simular | ||
+ | vsim & | ||
+ | |||
+ | ::* No ModelSim execute os seguintes arquivos .do: | ||
+ | Subsystem_compile.do | ||
+ | Subsystem_tb_compile.do | ||
+ | Subsystem_tb_sim.do | ||
+ | |||
+ | ::* Observe que o sinal gerado pelo código VHDL é igual ao sinal calculado pelo Simulink. | ||
+ | <center> | ||
+ | [[Arquivo:teste_sin_ModelSim.png | 600 px]] | ||
+ | </center> | ||
+ | ::*Observe que no arquivo de testbench, existe uma instrução de ASSERT conferindo se os dois sinais são iguais: | ||
+ | <syntaxhighlight lang=vhdl> | ||
+ | IF Out1_testFailure = '0' THEN | ||
+ | ASSERT FALSE | ||
+ | REPORT "**************TEST COMPLETED (PASSED)**************" | ||
+ | SEVERITY NOTE; | ||
+ | ELSE | ||
+ | ASSERT FALSE | ||
+ | REPORT "**************TEST COMPLETED (FAILED)**************" | ||
+ | SEVERITY NOTE; | ||
+ | END IF; | ||
+ | </syntaxhighlight> | ||
+ | :* Exemplo mais complexo | ||
+ | ::* Abra o modelo | ||
+ | sfir_fixed | ||
+ | ::* ajuste as configurações | ||
+ | hdlsetup('sfir_fixed') | ||
+ | ::*Siga o tutorial [http://www.mathworks.com/help/hdlcoder/gs/example-generating-hdl-code-from-a-simulink-model.html HDL Code Generation from a Simulink Model] | ||
+ | <!-- | ||
+ | |||
+ | ;Aula 35 a 37 (26 Jun a 3 Jul): | ||
+ | *Implementação do projeto final. | ||
+ | --> | ||
+ | {{collapse bottom}} | ||
==Código== | ==Código== |
Edição das 14h54min de 3 de maio de 2020
ATUAL
- Aula 30 (30 Nov)
- Apresentação do projeto Final
- Descrição do projeto AE5 - Projeto de um Detector de DTMF
- Estudar os blocos do Simulink: Time Scope, Spectrum Analyzer, Sine Wave, Chirp, Random Source, Signal From Workspace, From Multimedia File.
- Aula 31 a 33 (4 Dez)
- Aula de projeto (implementação da AE5)
- Aula 34 (14 Dez)
-
- Uso do HDL Coder
- Exemplo simples.
- Inicialmente construa a biblioteca de blocos suportados pelo HDLcoder
hdllib Show Blocks Supported for HDL Code Generation
- Construa o modelo mostrado na figura abaixo. (sugestão de frequência do sinal de 100Hz, e frequência de amostragem deve ser de 1000Hz)
- coloque o modelo em um subsistema e conecte a saída a um Time Scope
- Salve o modelo como teste_sin_HDLcoder, e em seguida faça o ajuste automático das configurações usando o comando.
hdlsetup('teste_sin_HDLcoder')
- Execute o HDLcoder
- Siga o fluxo do HDLcoder passo a passo e corrija eventuais problemas conforme indicado nas mensagens de ERRO.
- Será necessário mudar o tipo de dado do bloco seno e constante para fix(16).
- Após ter concluído com sucesso o fluxo de codificação HDL, vá até a pasta onde os arquivos VHDL foram gerados e observe que devem ser sido gerados os seguintes arquivos (Subsystem_tb_pkg.vhd Subsystem_tb.vhd Subsystem.vhd) na pasta
cd hdl_prj/hdlsrc/teste_sin_HDLcoder ls *.vhd
- Use o ModelSim para compilar os arquivos e em seguida simular
vsim &
- No ModelSim execute os seguintes arquivos .do:
Subsystem_compile.do Subsystem_tb_compile.do Subsystem_tb_sim.do
- Observe que o sinal gerado pelo código VHDL é igual ao sinal calculado pelo Simulink.
- Observe que no arquivo de testbench, existe uma instrução de ASSERT conferindo se os dois sinais são iguais:
IF Out1_testFailure = '0' THEN
ASSERT FALSE
REPORT "**************TEST COMPLETED (PASSED)**************"
SEVERITY NOTE;
ELSE
ASSERT FALSE
REPORT "**************TEST COMPLETED (FAILED)**************"
SEVERITY NOTE;
END IF;
- Exemplo mais complexo
- Abra o modelo
sfir_fixed
- ajuste as configurações
hdlsetup('sfir_fixed')
- Siga o tutorial HDL Code Generation from a Simulink Model
|}
Código
Código para teste do sensor de temperatura MAX-31856 usando a placa NodeMCU DEVKIT V1.0 com chip esp8266-12E
#include <Adafruit_MAX31856.h>
// Adaptado de https://github.com/adafruit/Adafruit_MAX31856/blob/master/examples/max31856/max31856.ino
//----------------------------------
// Use software SPI: CS, DI, DO, CLK
// Arduino Uno:
//Adafruit_MAX31856 maxthermo = Adafruit_MAX31856(10, 11, 12, 13);
//NODEMCU 1.0 ESP8266-12E:
// MAX-31856 / NODEMCU
// CS / GPIO 10 - SD3
// SDI / GPIO 4 - D2
// SDO / GPIO 5 - D1
// SCK / GPIO 16 - D0
//Adafruit_MAX31856 maxthermo = Adafruit_MAX31856(10,4,5,16);
//----------------------------------
// Use hardware SPI, just pass in the CS pin
// Arduino Uno:
//Adafruit_MAX31856 maxthermo = Adafruit_MAX31856(10);
//NODEMCU 1.0 ESP8266-12E:
// MAX-31856 / NODEMCU
// CS / GPIO 15 - D8
// SDI / GPIO 13 - D7
// SDO / GPIO 12 - D6
// SCK / GPIO 14 - D5
Adafruit_MAX31856 maxthermo = Adafruit_MAX31856(15);
//----------------------------------
void setup() {
Serial.begin(115200);
Serial.println("MAX31856 thermocouple test");
maxthermo.begin();
maxthermo.setThermocoupleType(MAX31856_TCTYPE_K);
Serial.print("Thermocouple type: ");
switch (maxthermo.getThermocoupleType() ) {
case MAX31856_TCTYPE_B: Serial.println("B Type"); break;
case MAX31856_TCTYPE_E: Serial.println("E Type"); break;
case MAX31856_TCTYPE_J: Serial.println("J Type"); break;
case MAX31856_TCTYPE_K: Serial.println("K Type"); break;
case MAX31856_TCTYPE_N: Serial.println("N Type"); break;
case MAX31856_TCTYPE_R: Serial.println("R Type"); break;
case MAX31856_TCTYPE_S: Serial.println("S Type"); break;
case MAX31856_TCTYPE_T: Serial.println("T Type"); break;
case MAX31856_VMODE_G8: Serial.println("Voltage x8 Gain mode"); break;
case MAX31856_VMODE_G32: Serial.println("Voltage x8 Gain mode"); break;
default: Serial.println("Unknown"); break;
}
}
void loop() {
Serial.print("Cold Junction Temp: ");
Serial.println(maxthermo.readCJTemperature());
Serial.print("Thermocouple Temp: ");
Serial.println(maxthermo.readThermocoupleTemperature());
// Check and print any faults
uint8_t fault = maxthermo.readFault();
if (fault) {
if (fault & MAX31856_FAULT_CJRANGE) Serial.println("Cold Junction Range Fault");
if (fault & MAX31856_FAULT_TCRANGE) Serial.println("Thermocouple Range Fault");
if (fault & MAX31856_FAULT_CJHIGH) Serial.println("Cold Junction High Fault");
if (fault & MAX31856_FAULT_CJLOW) Serial.println("Cold Junction Low Fault");
if (fault & MAX31856_FAULT_TCHIGH) Serial.println("Thermocouple High Fault");
if (fault & MAX31856_FAULT_TCLOW) Serial.println("Thermocouple Low Fault");
if (fault & MAX31856_FAULT_OVUV) Serial.println("Over/Under Voltage Fault");
if (fault & MAX31856_FAULT_OPEN) Serial.println("Thermocouple Open Fault");
}
delay(1000);
}