Escolar Documentos
Profissional Documentos
Cultura Documentos
Belo Horizonte
2021
1. Descrever o funcionamento detalhado do algoritmo ilustrativo apresentado na seção 3.2.
Elaborar um diagrama temporal com 30 segundos de duração, detalhando os aspectos de
prioridade e preempção das tarefas implementadas.
void setup()
{
Serial.begin(9600);
DDRB =0x0f;
PORTB=0x00;
setup_multitasking();
}
void setup_multitasking(void)
{
TCCR1A = 0x00; // CLOCK 16MHz
TCCR1B = 0x0b; // PRESCALER 64
OCR1A = 250; // Tint 250*64/16000000 = 1ms
TIMSK1 = 0x02; // habilita específica do timer
sei(); // habilitação geral de interrupções
}
A rotina de interrupção (ISR) possui o controle para executar as quatro tarefas do
código. Ela possui contadores que são incrementados a cada execução da
interrupção, para se controlar o período das tarefas (e.g., task0_counter,
task1_counter). As tarefas têm um valor máximo especificado para cada um dos
contadores definido em tempo de compilação por meio das diretivas define no
início do código - “#define TASK0_COUNTER_MAX 1000”. Caso o contador atinja
ou ultrapasse esse valor, a tarefa referente aquele contador é executada.
A tarefa 2 possui também parte de sua lógica na interrupção por tempo a cada 500
ms. Nela, caso a tarefa esteja habilitada, o LED altera o seu estado.
har task0_data;
unsigned c
unsigned c har task1_data;
unsigned c har task3_data;
task1_counter++;
if(task1_counter%TASK1_COUNTER == 0)
{
//Executar amostragem em 2ms
task1_data = PORTB&0x02;
if(task1_counter%TASK1_COUNTER_MAX == 0)
{
// Reamostragem em 10ms
task1_counter = 0;
task1_data = PORTB&0x02;
}
}
task2_counter++;
if(task2_counter>= TASK2_COUNTER_MAX )
{
//Executar exibição de informação em canal serial a cada 200ms
Serial.print("Informação Exibida");
task2_counter = 0;
}
task3_counter++;
if(task3_counter>=TASK3_COUNTER_MAX)
{
task3_counter=0;
// Executar varredura de teclado (botões) a cada 30ms
task3_data = PORTB&0xFC;
}
}
3. . Implementar um filtro digital de média móvel, com 8 amostras atrasadas, para o sistema
da seção 3.3, utilizando apenas as informações da resposta ruidosa.
O filtro digital de média móvel foi desenvolvido com a parametrização das quantidades
de amostras atrasadas.
Figura 2 - Gráfico da resposta do sistema da Seção 3.3. Em azul, o sinal com ruído e em
amarelo o sinal tratado com a média móvel
Pode-se perceber que a média móvel filtra os elementos de alta frequência,
adicionando porém um atraso de 8 amostras no processo.
4. Implementar um filtro digital de primeira ordem para o sistema da seção 3.3 e comparar
os resultados com filtro média móvel. Discutir tecnicamente a aplicabilidade destes filtros
para utilização em sistemas de controle digital.
Foi utilizado um filtro passa-baixa digital para filtrar o sinal ruidoso. A constante beta
foi definida de forma a não se ter a atenuação do sinal principal.
float sampleValues[SAMPLENUMBER] = {0, 0, 0, 0, 0, 0, 0, 0};
float medicao, dadosMediaMovel, dadosPassaBaixa;
static float medidaAnterior = 0;
float yMed(void);
float mediaMovel(float medida);
float passaBaixa(float medida);
void setup()
{
Serial.begin(9600);
randomSeed(analogRead(0));
}
void loop()
{
medicao = yMed();
dadosMediaMovel = mediaMovel(medicao);
dadosPassaBaixa = passaBaixa(medicao);
Serial.print(medicao);
Serial.print(", ");
Serial.print(dadosMediaMovel);
Serial.print(", ");
Serial.println(dadosPassaBaixa);
delay(1);
}
float yMed(void)
{
float randNum, ruido;
randNum = random(-100, 100) / 100.0;
ruido = 1 + 5 * randNum / 100; // 5% de ruído
return ruido * analogRead(0);
}
sampleValues[i] = medida;
i++;
if (i >= 8)
{
i = 0;
}
1. apenas alocação
2. alocação e liberação com um algoritmo rápido e simples;
3. alocação e liberação com coalescência;
4. alocação e liberação com coalescência que permite que o heap esteja
corrompido através de várias áreas de memória;
5. alocação e liberação através de biblioteca da linguagem C com algumas
proteções de exclusão mútua.