> For the complete documentation index, see [llms.txt](https://ps.trincabotz.com.br/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ps.trincabotz.com.br/eletronica/aulas-e-materiais/microcontroladores-pic-1.md).

# MICROCONTROLADORES (STM)

## `Download de Programas:`

{% hint style="warning" %}

### Instalando STM32CUBEIDE

#### Instalando o STM32CubeIDE Code no Windows

1. Acesse o [site oficial da stm32 para baixar o CUBEIDE](https://www.st.com/en/development-tools/stm32cubeide.html).
2. Clique no botão **Get Software** para ir pros instaladores.
3. Veja o instalador para o seu sistema operacional e clique em **Get latest**.
4. Se não estiver logado, a página irá pedir para criar uma conta ou logar com a já existente. Caso não possua conta clique em criar uma nova e preencha de forma padrão.
5. Após isso aguarde até que o download seja feito e depois descompacte o arquivo.
6. Clique no instalador dentro da pasta, ex: **st-stm32cubeide\_versão**...
7. Siga as etapas de instalação aceitando os termos de uso e tudo que puder instalar. Aparecerá uma janela solicitando a instalação de um driver e você deverá aceitar.
8. Após a conclusão, haverá um ícone azul escrito IDE, ao clicar nele o CUBEIDE será aberto.
   {% endhint %}

## `Material Oficial:`

{% hint style="info" %}

### Comandos STM:

* HAL\_GPIO\_WritePin(tipo\_de\_pino, numero\_do\_pino, estado\_do\_pino) - Essa função serve para mandar um pino para HIGH ou LOW. O primeiro parâmetro é se o pino é A, B, C ou D. O segundo parâmetro é o número do pino. O terceiro parâmetro é o valor, tendo GPIO\_PIN\_RESET para 0v e GPIO\_PIN\_SET para 3.3v.
* HAL\_GPIO\_ReadPin(tipo\_de\_pino, numero\_do\_pino,) - Essa função serve para ler o estado de um pino, podendo ser HIGH ou LOW. O primeiro parâmetro é se o pino é A, B, C ou D. O segundo parâmetro é o número do pino. Ele retorna o estado do pino.
* HAL\_GPIO\_TogglePin(tipo\_de\_pino, numero\_do\_pino,) - Essa função serve para inverter o estado de um pino, trocando de LOW para HIGH e HIGH para LOW. O primeiro parâmetro é se o pino é A, B, C ou D. O segundo parâmetro é o número do pino.
* HAL\_TIM\_Base\_Start\_IT(timer) - Essa função serve para iniciar a contagem e interrupção de um timer. O primeiro parâmetro é o endereço do Handler do timer, ex: \&htim1.
* HAL\_TIM\_PeriodElapsedCallback(timer) - Essa função serve para pegar a interrupção do timer por estouro de contagens. O parâmetro recebido é o endereço do Handler do timer, tendo que checar qual timer está fazendo a interrupção (em caso de múltiplas interrupções com o timer).
* HAL\_TIM\_PWM\_Start(timer, canal) - Essa função serve para iniciar o pwm em um canal de um timer. O primeiro parâmetro é o endereço do Handler do timer, ex: \&htim1. O segundo parâmetro serve para indicar qual canal é para ser gerado o pwm.
* HAL\_ADC\_Start(adc) - Essa função serve para iniciar o ADC para poder fazer as leituras. O primeiro parâmetro é o endereço do Handler do ADC, ex: \&hadc1.
* HAL\_ADC\_PollForConversion(adc, timeout) - Essa função serve para aguardar a conversão do ADC. O primeiro parâmetro é o endereço do Handler do ADC, ex: \&hadc1. O segundo parâmetro é o tempo limite de espera, coloque HAL\_MAX\_DELAY.
* HAL\_ADC\_GetValue(adc) - Essa função serve para pegar o valor convertido pelo ADC. O primeiro parâmetro é o endereço do Handler do ADC, ex: \&hadc1. O retorno é o valor convertido pelo ADC.
  {% endhint %}

{% file src="/files/iAbZOiAPaQ7J4pxC5JuR" %}
Slides da aula
{% endfile %}

{% embed url="<https://wiki.st.com/stm32mcu/index.php?oldid=58943&title=Getting_started_with_TIM>" %}
Wiki da ST sobre TIMER
{% endembed %}

{% embed url="<https://wiki.st.com/stm32mcu/wiki/Getting_started_with_ADC>" %}
Wiki da ST sobre ADC
{% endembed %}

<figure><img src="/files/bv06IVLHDUP4zCydYuk5" alt=""><figcaption><p>Pinagem do STM black pilll</p></figcaption></figure>

## `Material Adicional:`

{% hint style="info" %}
Confira as explicações sobre os conceitos mais complexos da atividade, incluindo: **Timer, Conversor A/D, PWM, Sensor VL53L0X** e muitos outros:
{% endhint %}

{% hint style="success" %}

### CONVERSOR A/D

Mas afinal, o que é um Conversor A/D? No que consiste esse mecanismo interno do microcontrolador? Qual a sua principal função?
{% endhint %}

* Um **Conversor Analógico Digital** é um dispositivo programável capaz de transformar um sinal analógico, em um sinal digital;<br>
* Quando convertido, este mesmo sinal torna-se “legível” por uma máquina (no caso o STM);<br>
* O Conversor, por sua vez, quantifica esses valores de conversão eletronicamente dentro de um número finito de valores inteiros, determinado pela resolução do conversor (dada em Bits);<br>
* Logo, **um Conversor de 8 Bits**, por exemplo, transforma a tensão em valores legíveis por uma máquina, isto é, valores decimais entre **0 e 256**;<br>
* Como **100% da tensão equivale a 3.3V**, pode-se afirmar que **100% da conversão A/D, em decimal, equivale a 256**. Assim, **1% da conversão A/D equivale à resolução de 12.89mV / Bit**;<br>

{% hint style="info" %}
Pense neste raciocínio, porém com um Conversor A/D de 10 Bits, como o de um PIC18F1330. Para isso, confira a Figura 1:
{% endhint %}

![Figura 1 -  Diagrama em Blocos do Conversor A/D (10 Bits).](/files/-M_X-TMU2i-1rytr_YtW)

{% hint style="info" %}

#### Observações:

* Observe que cada canal, desde o AN0 até o AN3, pode ser configurado tanto como entrada, quanto como saída, sendo ela analógica ou digital.<br>
* **O valor numérico da conversão A/D (0 a 1023 - 10 Bits)** pode ser manuseado pelo programador.
  {% endhint %}

{% hint style="success" %}

### TIMER (TEMPORIZADOR)

Mas afinal, o que é um Timer? No que consiste esse mecanismo interno do microcontrolador? Qual a sua principal função?
{% endhint %}

* Um Timer **(ou temporizador)** é um mecanismo registrador, de natureza programável, responsável por realizar contagens com base na frequência do microcontrolador, seja ela interna ou externa;<br>
* Assim como o Conversor A/D, o Timer também constitui um módulo interno dentro do STM e, por essa razão, sua medida é dada em Bits; <br>
* Para efetuar a contagem, o Timer, precisa, em tese, ter todas as suas “entradas” configuradas para obter o desempenho desejado; <br>
* Para que o Timer 0 funcione, é preciso definir os **valores de frequência**, a **transição de borda** (subida ou descida), o **tipo de oscilação** (interna/externa), o **número de Bits** (8 ou 16), etc;

![Figura 2 - Diagrama em Blocos do Timer 0 (8 Bits)](/files/-M_X1TOLIggD55Fb3j-m)

{% hint style="info" %}

#### Observações:

* Quando o Timer 0 estiver configurado, ele será capaz de realizar diversas contagens: **as mais simples (de 0 até 255 - 8 Bits)**, até outras **mais complexas, partindo de valores diferentes de zero ou interrompendo-as para não atingir o valor máximo suportado pelo módulo**;<br>
* Essa interrupção, ou esse “estouro” do Timer, só pode ser viabilizado pela **Flag** desde mesmo registrador, isto é, pela **“bandeira”** que sinaliza não somente o início, mas também o fim dessa mesma contagem.
  {% endhint %}

{% hint style="success" %}

### PWM (Modulação por Largura de Pulso)

Mas afinal, o que é um sinal PWM? No que consiste esse sinal? Como sintetizá-lo adequadamente?
{% endhint %}

* O PWM é um recurso muito utilizado na programação para **alterar o comportamento de uma determinada saída** do microcontrolador;<br>
* Normalmente, o PWM é utilizado em robôs para comunicação entre módulos ou para controles de potência;<br>
* Há diversas formas de gerar um sinal PWM em um microcontrolador, todos têm uma coisa em comum, eles utilizam um timer para medir o tempo entre as variações do sinal;<br>
* Em  baixos níveis de abstração pode-se configurar os módulos do timer para isso ou, se estiverem disponíveis, os módulos de PWM do microcontrolador;<br>
* Em abordagens de alto nível de abstração, pode se encontrar funções que realizam toda essa configuração de uma forma mais dinâmica;<br>

![Figura 3 - Características de um sinal PWM.](/files/-M_XEy0BtW7AVWk2LYyx)

{% hint style="info" %}

#### Observações:

* Nesse sentido, **quanto MAIOR a largura do período em que o sinal PWM estiver EM NÍVEL ALTO, MAIOR a intensidade do LED aceso**. Se o circuito utilizasse uma carga potente, um motor por exemplo, mais rápida seria a sua rotação;<br>
* Por outro lado, **quanto MENOR a largura do período em que o sinal PWM estiver EM NÍVEL ALTO, MENOR a intensidade do LED aceso**. Se o circuito utilizasse uma carga potente, um motor por exemplo, mais lenta seria a sua rotação.
  {% endhint %}

{% hint style="success" %}

### SENSOR VL530X

Mas afinal, como é a comunicação do Sensor VL530X? No que consiste esse componente? Como ele funciona?
{% endhint %}

* Os Sensores VL530X são responsáveis pelo **direcionamento e orientação do robô e detectar a distância** do robô adversário;<br>
* O sensor VL53L0X é um sensor do tipo ToF (Time of Fligth). Este tipo de sensor mede a distância à sua frente enviando um sinal infravermelho e medindo o tempo até a reflexão do mesmo;<br>
* O VL530X possui um rápido tempo de reação e um alcance de, aproximadamente, 2m de distância;<br>
* Sua interface conta com 6 pinos:

  * &#x20;Dois referentes à alimentação do sensor (VCC e GND);
  * Dois referentes à comunicação I2C (SDA e SCL);
  * Um de configuração do endereço de comunicação (XSHUT);
  * Um de interrupção, não utilizado pela equipe (GPIO01).<br>

  <figure><img src="/files/MxVkcAh098SEFcuh7s6Q" alt=""><figcaption><p>Figura 4 - Módulo do sensor VL53LL0X</p></figcaption></figure>
* Seu funcionamento consiste na emissão e recepção de um feixe de lu infravermelha como no diagrama abaixo:

<figure><img src="/files/hwrI9jyodxlLbiHvNkuv" alt=""><figcaption><p>Figura 5 - Diagrama de funcionamento do Sensor VL53L0X</p></figcaption></figure>

{% hint style="info" %}

### Comunicação I2C

{% endhint %}

A comunicação I2C (Inter-Integrated Circuit) é um protocolo de comunicação serial que permite a troca de dados entre dispositivos eletrônicos de maneira simples e eficiente. Este protocolo utiliza duas linhas principais:

* **SDA (Serial Data Line):** Responsável pela transmissão de dados entre os dispositivos.
* **SCL (Serial Clock Line):** Fornece o sinal de clock que sincroniza a transferência de dados.

A comunicação I2C permite a conexão de múltiplos dispositivos em um barramento compartilhado, utilizando endereços para identificar cada dispositivo participante. Com suporte nativo em muitos microcontroladores e sensores, como o VL530X, a I2C é amplamente utilizada em aplicações de sistemas embarcados devido à sua flexibilidade e simplicidade.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ps.trincabotz.com.br/eletronica/aulas-e-materiais/microcontroladores-pic-1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
