Onde colocar os cálculos?Dentro do manipulador de interrupções ou do loop principal?(aplicativo incorporado em tempo real)

StackOverflow https://stackoverflow.com//questions/9609882

Pergunta

Estou desenvolvendo uma aplicação embarcada para controle de motores e tenho dúvidas sobre o que fazer com alguns cálculos que transformam valores numéricos do ADC em valores físicos sinalizados (Amps).

Devo fazer os cálculos no manipulador de interrupção ou devo apenas usar o manipulador para definir um sinalizador global e fazer os cálculos no loop principal quando o sinalizador for definido?

Agradeço antecipadamente.

Foi útil?

Solução

Não há nenhuma resposta de tamanho para isso.Depende de seus requisitos de tempo, carga de interrupção existente, etc.

Se é uma multiplicação bastante simples ou algo assim, então faria isso na interrupção e seguir em frente.

Apenas certifique-se de saber o que está fazendo e não passa mais tempo em sua interrupção do que deveria.

Outras dicas

Quanto menos trabalho você pode fazer em seu manipulador de interrupção, melhor.Agora, pode não ser um grande negócio para sua inscrição, mas chegará um tempo em que sua carga do sistema for maior e você não desejará manter outras tarefas de maior prioridade para lidar com interrupções.Você pode querer olhar em semáforos e multithreading adequado, em vez de apenas definir bandeiras globais.

Depende do que você deseja fazer com os valores ADC e da rapidez com que você precisa fazer isso.Se você precisar executar alguma ação urgente com base nos valores do ADC, deverá lidar com isso na interrupção.No entanto, se for esse o caso, para evitar a despesa de calcular primeiro o valor analógico "real" das contagens do ADC, você deve apenas expressar seus limites críticos em termos das contagens do ADC.

Por exemplo, se o seu ADC produzir 8 contagens por volt e você precisar disparar uma parada de emergência se o ADC reportar mais de 1,5 volts, você escreve seu código de interrupção para disparar a parada de emergência em 12 contagens.Você ainda pode passar as contagens ADC para o loop principal para tradução em unidades fáceis de usar para fins de interface do usuário, etc.

O princípio geral é que para garantir que você cumpra seus prazos, você estrutura sua inscrição e quaisquer configurações para facilitar ao máximo o cumprimento desses prazos.Se algo não tiver um prazo definido, coloque-o no loop principal (novamente, em geral).

Uma coisa a se pensar é a consistência dos dados.Se você estiver obtendo vários valores relacionados do ADC (posição, tensão, corrente, etc.), então você pode querer fazer algo para garantir que está trabalhando com um conjunto consistente.Isso pode significar que uma atualização em segundo plano é melhor que uma atualização no ISR.Até mesmo a consistência de uma única leitura para uma determinada passagem do algoritmo pode ser importante.Considere este código de segundo plano.

  delta = data-lastData;
  //ISR could update data here.
  lastData = data;
  something = K1* data + K2 * delta;  //this may be wrong now
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top