Projeto

Geral

Perfil

Ações
  1. Passo 4 leitura do encoder com o uso de labview
    tarefa já feita e pode-se encontrar no link http://redmine.roboime.com.br/issues/741, onde será explicado possíveis problemas que pode-se encontrar ao tentar fazer a leitura do encoder.

Será mostrado agora como fazer a leitura do encoder no labview através de um outro código que foi desenvolvido, é aconselhável entender primeira a tarefa 741 que encontra-se no link acima antes de olhar o que vem a seguir, pois certos aspectos da programação que foram explicados na tarefa 741 não serão explicados agora:

Esta tarefa será realizada através do uso do STM32CubeMX, devido principalmente ao fato de a standard peripheral library não ser mais atualizada, e portanto migraremos para o uso da HAL library que continua possuindo atualizações.

Inicialmente devemos criar um projeto no STM32CubeMX, e selecionar stm32f411VETx (que é o microcontrolador que será utilizado para esta tarefa) e agora fazer as configurações no Cube. Será ativado o FREERTOS que é basicamente um sistema operacional em tempo real para microcontroladores, e para ativar essa opção basta ir no Cube em Pinout->Configuration->MiddleWares->FREERTOS->ENABLED. Iremos agora configurar o clock, para isto basta ir em Pinout->Configuration->Peripherals->RCC->HSE->Crystal/Ceramic Resonator. Após isso é necessário escolher os pinos que irão servir para a leitura de encoder, sendo para esse caso escolhidos PA6 e PA7 com o TIMER 3 (atenção, para leitura do encoder deve-se escolher entre os timers 2 a 5 pois os outros timers não irão funcionar para leitura), para esta configuração deve-se ir em Pinout->Configuration->Peripherals->TIM3->Combined Channels->Encoder Mode. Vamos agora configurar a porta USB da discovery para que possamos fazer a leitura no labview, para isto va em Pinout->Configuration->Peripherals->USB_OTG_FS->Mode->Device only. Agora vá em Pinout->Configuration->Peripherals->SYS->Debug->Serial wire. Para finalizar é necessário fazer uns ajustes nas frequências de clock, para isto vá em clock configuration e no lado esquerdo haverá input frequency onde deve ser colocado 8, em Pll Source Mux deve ser escolhido HSE, em System Clock Mux deve ser escolhido PllCLK![esquematico ponte H](Cube_clock.jpg) e provavelmente após essas alterações o Cube ira acusar erros em algumas frequências, para resolver isso basta utilizar o resolvedor automático que encontra-se ao lado direito das lupas e tem a aparência de um círculo vermelho com um check. Basta agora gerar clicando na ferramenta amarela que encontra-se embaixo de help após isso ira abrir uma janela em que deve ser escolhido o nome do projeto, e alterar a Toolchain/IDE para a IDE a ser utilizada que no nosso caso é a atollic TRUEStudio, pronto agora foi gerado o projeto.

Agora no projeto criado no atollic vá em Src->main.c, antes de implementar o código de fato deve-se fazer algumas alterações nas configurações geradas automaticamente pelo Cube, alterações as quais foram comentadas na tarefa 741 mas será mostrado agora como fazer na prática. Primeira alteração: procure a função que configura o TIMER e altere o periodo em htim3.Init.Period de 0 para 0xffff, encoder mode de TIM_ENCODERMODE_TI1 para TIM_ENCODERMODE_TI12, para que seja utilizado dois pinos na leitura do encoder em que PA6 corresponde a TIM3_CHANNEL 1 e PA7 TIM3_CHANNEL 2 ![esquematico ponte H](TIM3.jpg).

Segunda alteração: vá em Src->stm32f4xx_hal_msp.c procure onde esta sendo feita a configuração dos pinos ![esquematico ponte H](pinos.jpg) em GPIO_InitStruct.Pull mude de GPIO_NOPULL para GPIO_PULLUP. Agora volte a main.c, a implementação do código será feita fora da main, em uma parte chamada StartDefaultTask, e dentro do for(;;) será colocado a lógica a ser feita. Nós queremos fazer a leitura do encoder no labview, para isto será necessário colocar no código no atollic algo que transmita informação para a porta serial do USB, e podemos encontrar essa função em Src->usbd_cdc_if.c, procure a função CDC_Transmit_FS para saber como utiliza-la. A lógica esta demonstrada abaixo ![esquematico ponte H](logica.jpg), o array de caracteres ira servir para representar uma string formada pelo número associado a leitura do encoder, para isto utiliza-se a função sprintf para passar a informação da leitura do encoder para o array de caracteres. Para o acesso a leitura do encoder temos que ir ao registrador CNT que podemos acessar da forma htim3.Instance->CNT, mas como descobrir que era dessa forma para acessar o registrador? basta ir onde esta configurado o TIM3 e la terá htim3.Instance, mas se olhar a descrição de Instance é dito ser um register base adress, ou seja possui o endereço dos registradores, e ao colocar o mouse emcima de Instance em htim3.Instance e segurar Ctrl e clicar com o botão esquerdo do mouse, você será direcionado para onde esta descrito uma struct com vários parâmetros, dentre eles *Instance, que é uma variável do tipo TIM_Typedef, agora clicar ir para onde o TIM_Typedef esta descrito da mesma forma que foi feita para Instance, e veremos que temos os registradores como parâmetros.

Vamos agora para o código no labview: ![esquematico ponte H](labview.jpg) . A primeira coisa a se fazer é utilizar o recurso VISA, que é o que ira permitir a leitura através da porta serial USB, e para isto basta clicar com o botão direito do mouse no block diagram do labview e procurar o recurso visa ou ir em Instrument I/O onde podera encontrar o recurso, nós precisamos por uma questão de bom hábito inicialmente fechar a porta com o Close Visa e após isso abrir (com o Open Visa) e a esses dois deve ser criado um indicator no campo visa resource name para que no painel se escolha a porta USB que esta sendo utilizada. Para que possa se fazer a leitura, antes de conectar o Open Visa ao Read Visa (para ler as informações que estão sendo transmitidas a porta serial) é necessário o property Node para sabermos quantos bytes estão sendo enviados e consequentemente quantos devemos ler com o Read Visa, para isso basta ir em VISA e la terá a opção Visa advanced onde encontrar-se-á o property Node, ao coloca-lo no block diagram ele ainda não estará com a configuração necessária para o que queremos fazer, então deve-se clicar com o botão esquerdo do mouse no campo property dele, ir em serial settings-> number of bytes at serial port, assim agora teremos uma saida do property node como sendo o número de bytes que está sendo enviado a porta serial, essa saída é conectada ao Read Visa. O event case é apenas para garantir que não será feita a leitura se o número de bytes na porta serial for nulo. Ao final da leitura deve-se colocar o close Visa. Um ponto importante a ser comentado é o fato do relógio que foi colocado dentro do while, esse relógio é INDISPENSÁVEL para o funcionamento do código, demorei vários dias sem conseguir fazer a leitura ao rodar o labview por causa que não coloquei esse relógio, antes do relógio a leitura funcionava apenas com o uso do highlight execution que torna o funcionamento do código um pouco mais devagar por mostrar o fluxo de dados em cada parte. Não sei explicar direito ainda a razão da necessidade do relógio para poder fazer a leitura, mas tomando como base o fato de que o código funcionava com highlight execution, e sem isso apenas aparecia 0 no envio de bytes pela porta serial, provavelmente o labview deve fazer a leitura muito rápida e na maior parte do tempo não esta sendo enviado nenhuma informação, por isso ele só assume valor 0 na na quantidade de bytes lidos.

links para os códigos no github:https://github.com/Hugogomes9/leitura-encoder-com-labview

Atualizado por Anônimo há aproximadamente 6 anos · 3 revisões