Esta firmware controla 4 motores DC com encoder e fecha malha de velocidade em 1 kHz. A placa recebe comandos de velocidade do robo por serial, converte para velocidades individuais das rodas e aplica PID em cada motor.
main()inicializa GPIO, DMA, ADC, timers, I2C eUSART2.AppC_Init()cria a aplicacao C++ e inicia PWM, encoders e calibracao do ADC.TIM6interrompe a cada1 mse chamaAppC_FastTick1kHz().- No fast tick:
- le encoder de cada roda
- calcula RPM
- filtra RPM com um biquad passa-baixa
- roda 4 controladores PID
- atualiza o PWM de cada motor
- No loop principal:
- processa recepcao serial por DMA circular
- envia telemetria
- atualiza leitura de bateria e heartbeat do LED
- MCU:
STM32F103RCTx - Encapsulamento:
LQFP64 - Clock do sistema:
72 MHzcom cristal externo em8 MHz+PLL x9 TIM1eTIM8: PWM dos motoresTIM2,TIM3,TIM4,TIM5: interface encoderTIM6: base de tempo do controle em1 kHzUSART2: comunicacao serial em1000000 baudADC1canalIN14 / PC4: leitura da bateriaI2C2: reservado emPB10/PB11
Configuracao atual do CubeMX:
HSE = 8 MHzPLL source = HSEPLL multiplier = x9SYSCLK = 72 MHzAHB = 72 MHzAPB1 = 36 MHz- clocks efetivos dos timers em
APB1 = 72 MHz APB2 = 72 MHz- clock do ADC =
12 MHzcom prescaler/6
Impacto direto no firmware:
TIM1eTIM8usam clock de72 MHz, o que leva a PWM de30 kHzcomARR = 2399TIM6usa prescaler71e periodo999, gerando a interrupcao de1 kHz- os timers de encoder tambem operam com base de
72 MHz
Ordem eletrica usada no firmware:
M1: frente-direitaM2: frente-esquerdaM3: traseira-direitaM4: traseira-esquerda
Saidas PWM:
M1:TIM1 CH2/CH3nos pinosPA9ePA10, com complementaresCH2N/CH3NemPB0ePB1M2:TIM8 CH1/CH2nos pinosPC6ePC7M3:TIM1 CH1/CH4nos pinosPA8ePA11M4:TIM8 CH3/CH4nos pinosPC8ePC9
Entradas de encoder:
M1:TIM5emPA0ePA1M2:TIM3emPA6ePA7M3:TIM2emPA15ePB3M4:TIM4emPB6ePB7
Observacao: o encoder de M3 e invertido por software.
Pinos usados pelo firmware:
PC13: LEDPD0ePD1: oscilador externoHSEPA2/PA3:USART2 TX/RXPC4: bateria emADC1_IN14PB10/PB11:I2C2 SCL/SDAPA13/PA14:SWDIO/SWCLK
Pinos livres ou nao usados nesta firmware permanecem sem funcao aplicada no .ioc.
- PWM:
30 kHz(ARR = 2399) - Amostragem de RPM:
1 ms - PID:
Kp = 16.9Ki = 89.3Kd = 0.001
- Saturacao do PID:
-2399a2399 - Limite de setpoint:
+/- 530 rpm - Encoder:
11 PPR- quadratura
x4 - reducao
18.8:1 - ticks por volta da roda:
827.2
- Entrada analogica:
PC4 - Referencia ADC:
3.3 V - Resolucao:
12 bits - Divisor resistivo modelado como:
- parte alta
10 kohm - parte baixa
3.3 kohm
- parte alta
- ganho aplicado no software:
(10 + 3.3) / 3.3 = 4.03 - taxa de atualizacao:
100 ms
Quando o comando de um motor e zero:
brake_mode = 0: coast, PWM zerado nos dois ladosbrake_mode = 1: brake, dois lados em nivel alto
O LED em PC13 alterna estado a cada 200 ms, servindo como heartbeat da firmware.




