Imprecisão de tempo de delay no STM32 ou pino incorreto?

Meu post importado de outro forum.

Um salve a todos do forum.
Estou fazendo testes com 3 micro processadores, o Arduino nano, STM 32 e o ESP 32.
Tive problemas com leitura de controle de fluidos e achei os resultados um pouco estranhos, por isso resolvi fazer testes utilizando um osciloscópio.
A principio resolvi fazer um simples teste com a função delayMicroseconds com pinout high de 1.2 ms em cada um dos três. 
Os Arduino (UNO e NANO), ESP32 Wroom estavam precisos com a leitura do osciloscópio mas o STM32 precisou de um fator de correção para diminuir o tempo que estava acima de 1.2 ms.
Estaria eu utilizando um pino errado (PB5) para executar esta função?
Segue abaixo o exemplo do código utilizado no arduino ide 

// ################# Definicao de constantes
#define FUEL PB5 // output DO PULSO
// ################# Declaracao de variaveis
float PULSO = 1.2 ; // TEMPO DE DURAÇÃO DO PULSO EM MS a ser convertido em microsegundos
float FATOR = 0.85; // fator de correção de 0,85 para ajustar o tempo lido no osciloscópio
float PULSOM = PULSO * 1000 * FATOR ; // TEMPO ESTADO HIGH

do
{
digitalWrite(FUEL, HIGH);
delayMicroseconds(PULSOM);
digitalWrite(FUEL, LOW);
delay(500); // TEMPO DE ESTADO LOW
}
while (1 == 1);

###############################################################################

Exibições: 162

Responder esta

Respostas a este tópico

Adicionando informação
Refiz o teste verificando as configurações e utilizando outro STM32F103C8 e os resultados foram idênticos.
Foi necessário utilizar um fator de correção para o STM32 manter um pulso com o tempo correto.
Mais alguém teve esta experiência ou estou utilizando pino errado?

Colaboração importada de Sérgio Lembo

Erro bravo esse se considerarmos que a ST diz no manual que o RC interno é calibrado de fábrica para 1%. Aqui estou assumindo que está sendo utilizado o oscilador interno. Caso seja externo a colocação do osciloscópio nos pinos OSC_IN ou OSC_OUT já te permitirá conferir a frequência base. 
De qualquer forma aqui vai um link de calibração do RC interno quando se deseja precisão de tempo <1%, talvez te dê uma luz.
https://www.st.com/content/ccc/resource ... 289137.pdf

No seu código não aparece as informações iniciais onde é informado o valor do clock e sua origem.
Acredito ter havido um erro nas informações iniciais do seu compilador na parte de frequência e origem, 15% de erro é coisa demais.
Boa sorte

Carlos , você esta usando clock interno? 

Qual frequência, qual configuração?

Se quer precisão use um cristal de boa qualidade. Eu nunca usaria o RC interno. 

OBS - já fiz medições de clock de Arduino e as variações são expressivas. 

Os cristais usados nos Arduinos (chineses) são de baixa qualidade. 

Clock interno é usado em circuitos onde o controle de tempo não é importante. 

Que parece não ser o seu caso. 

Na verdade eu preciso de um clock interno preciso para dosar quantidade de combustível para um bico injetor que pode variar entre 1.2 e 2.5 ms  e vou utilizar a leitura de um pulso externo para iniciar o período de injeção.

Vou deixar dois sketchs que utilizei para fazer testes de dosagem de combustível sendo um para o arduino nano que  funcionou perfeitamente e outro para o STM32 que teve imprecisão de tempo de delay.

[ ]´s  

A minha opinião é a seguinte:

No mesmo "modulo" estes erros apresentados são constantes ou variam.

Se forem constantes acredito que não seja problemas, pois conhecendo eles podemos

corrigi-los com um fator de correção.

Mas se forem inconstantes, dai fica inviável usar o "modulo".

RV

Carlos, ficou devendo a respostas.

A sua placa STM32 esta usando clock interno? Ou esta usando um cristal no clock ?

Qual frequência, qual configuração?

Afinal, qual placa STM32 esta usando ? 

Prezado Sergio
Obrigado pela ajuda 
Eu fiquei tão perplexo com a falha que cheguei a utilizar dois osciloscópios para ver a leitura e só não testei outro STM32 por não possuir algum vindo de outro lote de fabricação.
Sobre o seu questionamento sobre não haver valor do clock de origem, realmente não há porque não estou usando nenhum settings de clock no código.
Estou utilizando o arduino IDE nos três processadores e baseado nas suas informações e meus testes posso chegar a algumas hipóteses.
1 - Necessidade de settings de clock no código para uso com STM32 no Arduino IDE.
2 - Bug no compilador do arduino IDE para STM32
3 - Lote de processadores com falha.

Bom dia CB,

Tenho aqui o UNO/MEGA/Mini/Due/ESP8266/ESP32/SMT32.

Gostaria de repetir o teste que você fez com eles e comparar os resultados.

Para que seja fiel ao resultado, gostaria que anexasse um arquivo com o sketch completo 

que usou para este fim.

Por favor não cole na área de texto.

Anexe como um arquivo.

RV

primeiros teste usando o sketch anexo.

Acredito que o responsável pelo resultado não seja o ucontrolador e sim o cristal utilizado.

Resultados:     Melhor resultado até agora  ESP8266.

RV

useg
Base de tempo----> >  1200
u Tempo lido % erro
mini 1209,416667 0,78%
Uno 1209,583333 0,80%
Mega 1202 0,17%
Due 1339,66666 11,64%

Anexos

Opa.
Segue anexados os scketchs para arduino e STM32.

Anexos

Enviei os sketchs pra você.

Você chegou a testar um STM32 sem usar o fator de correção?

Se sua hipótese do cristal estiver correta, realmente pode ocorrer algum problema no cristal dos meus dois STM32, ou seja, o lote que comprei.

[ ]´s

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2018   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço