Xavier Jannin / Mbed 2 deprecated PETIT_robot

Dependencies:   mbed

Committer:
xav_jann1
Date:
Wed May 22 16:54:27 2019 +0000
Revision:
0:1cfd66c3a181
Premiere version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xav_jann1 0:1cfd66c3a181 1 #include "Encodeur.h"
xav_jann1 0:1cfd66c3a181 2
xav_jann1 0:1cfd66c3a181 3 // Timers & Encoders:
xav_jann1 0:1cfd66c3a181 4 TIM_HandleTypeDef timer3, timer4;
xav_jann1 0:1cfd66c3a181 5 TIM_Encoder_InitTypeDef encoder3, encoder4;
xav_jann1 0:1cfd66c3a181 6
xav_jann1 0:1cfd66c3a181 7 // Constructeur:
xav_jann1 0:1cfd66c3a181 8 Encodeur::Encodeur(char e, int resolution, int diametre) {
xav_jann1 0:1cfd66c3a181 9 TIM_Encoder_InitTypeDef* encodeur;
xav_jann1 0:1cfd66c3a181 10 TIM_TypeDef* TIMx;
xav_jann1 0:1cfd66c3a181 11
xav_jann1 0:1cfd66c3a181 12 if (e == 'G') {
xav_jann1 0:1cfd66c3a181 13 encodeur = &encoder3;
xav_jann1 0:1cfd66c3a181 14 TIMx = TIM3;
xav_jann1 0:1cfd66c3a181 15 m_timer = &timer3;
xav_jann1 0:1cfd66c3a181 16 } else if (e == 'D') {
xav_jann1 0:1cfd66c3a181 17 encodeur = &encoder4;
xav_jann1 0:1cfd66c3a181 18 TIMx = TIM4;
xav_jann1 0:1cfd66c3a181 19 m_timer = &timer4;
xav_jann1 0:1cfd66c3a181 20 }
xav_jann1 0:1cfd66c3a181 21 m_resolution = resolution * 4 - 1; // *4 car l'encodeur détecte tous les fronts des 2 signaux
xav_jann1 0:1cfd66c3a181 22 m_diametre = diametre;
xav_jann1 0:1cfd66c3a181 23 m_ticks_par_mm = (float)m_resolution / (float)(M_PI * m_diametre);
xav_jann1 0:1cfd66c3a181 24
xav_jann1 0:1cfd66c3a181 25 m_tours = -1; // -1 -> 0 au démarrage (car une interruption est déclenchée)
xav_jann1 0:1cfd66c3a181 26
xav_jann1 0:1cfd66c3a181 27 EncodeurInit(encodeur, m_timer, TIMx, m_resolution);
xav_jann1 0:1cfd66c3a181 28 }
xav_jann1 0:1cfd66c3a181 29
xav_jann1 0:1cfd66c3a181 30 // Getters & Setters:
xav_jann1 0:1cfd66c3a181 31 uint16_t Encodeur::getCount() { return __HAL_TIM_GET_COUNTER(m_timer); }
xav_jann1 0:1cfd66c3a181 32 int Encodeur::getTours() { return m_tours; }
xav_jann1 0:1cfd66c3a181 33 int* Encodeur::getTours_ptr() { return &m_tours; }
xav_jann1 0:1cfd66c3a181 34 void Encodeur::updateTour(int dtour) { m_tours += dtour; }
xav_jann1 0:1cfd66c3a181 35
xav_jann1 0:1cfd66c3a181 36 int Encodeur::getDist() { return M_PI * m_diametre * (m_tours + (float)getCount() / (float)m_resolution); }
xav_jann1 0:1cfd66c3a181 37 int Encodeur::getTotalCount() {
xav_jann1 0:1cfd66c3a181 38 int encodeur_tour = m_tours;
xav_jann1 0:1cfd66c3a181 39
xav_jann1 0:1cfd66c3a181 40 // Détecte si le compteur s'est réinitialisé sans ajouter le tour :
xav_jann1 0:1cfd66c3a181 41 // (c'est-à-dire TIMx_IRQHandler ne s'est pas encore déclenché)
xav_jann1 0:1cfd66c3a181 42 if (__HAL_TIM_GET_FLAG(m_timer, TIM_FLAG_UPDATE) != RESET) {
xav_jann1 0:1cfd66c3a181 43 // Récupère la direction de rotation de l'encodeur:
xav_jann1 0:1cfd66c3a181 44 bool direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(m_timer);
xav_jann1 0:1cfd66c3a181 45
xav_jann1 0:1cfd66c3a181 46 // Ajoute ou enlève un tour:
xav_jann1 0:1cfd66c3a181 47 encodeur_tour += direction ? -1 : 1;
xav_jann1 0:1cfd66c3a181 48 }
xav_jann1 0:1cfd66c3a181 49
xav_jann1 0:1cfd66c3a181 50 return encodeur_tour * m_resolution + getCount();
xav_jann1 0:1cfd66c3a181 51 }
xav_jann1 0:1cfd66c3a181 52
xav_jann1 0:1cfd66c3a181 53 int Encodeur::getDiametre() { return m_diametre; }
xav_jann1 0:1cfd66c3a181 54 int Encodeur::getResolution() { return m_resolution; }
xav_jann1 0:1cfd66c3a181 55 float Encodeur::getTicks_par_mm() { return m_ticks_par_mm; }
xav_jann1 0:1cfd66c3a181 56
xav_jann1 0:1cfd66c3a181 57 // Initialisation du Timer pour l'Encodeur:
xav_jann1 0:1cfd66c3a181 58 void EncodeurInit(TIM_Encoder_InitTypeDef* encodeur, TIM_HandleTypeDef* timer, TIM_TypeDef* TIMx, uint32_t resolution) {
xav_jann1 0:1cfd66c3a181 59 // Timer:
xav_jann1 0:1cfd66c3a181 60 timer->Instance = TIMx;
xav_jann1 0:1cfd66c3a181 61 timer->Init.Prescaler = 0;
xav_jann1 0:1cfd66c3a181 62 timer->Init.Period = resolution;
xav_jann1 0:1cfd66c3a181 63 timer->Init.CounterMode = TIM_COUNTERMODE_UP;
xav_jann1 0:1cfd66c3a181 64 timer->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
xav_jann1 0:1cfd66c3a181 65
xav_jann1 0:1cfd66c3a181 66 // Encodeur:
xav_jann1 0:1cfd66c3a181 67 encodeur->EncoderMode = TIM_ENCODERMODE_TI12;
xav_jann1 0:1cfd66c3a181 68
xav_jann1 0:1cfd66c3a181 69 // Channel 1:
xav_jann1 0:1cfd66c3a181 70 encodeur->IC1Filter = 0;
xav_jann1 0:1cfd66c3a181 71 encodeur->IC1Polarity = TIM_INPUTCHANNELPOLARITY_FALLING;
xav_jann1 0:1cfd66c3a181 72 encodeur->IC1Prescaler = TIM_ICPSC_DIV1;
xav_jann1 0:1cfd66c3a181 73 encodeur->IC1Selection = TIM_ICSELECTION_DIRECTTI;
xav_jann1 0:1cfd66c3a181 74
xav_jann1 0:1cfd66c3a181 75 // Channel 2:
xav_jann1 0:1cfd66c3a181 76 encodeur->IC2Filter = 0;
xav_jann1 0:1cfd66c3a181 77 encodeur->IC2Polarity = TIM_INPUTCHANNELPOLARITY_FALLING;
xav_jann1 0:1cfd66c3a181 78 encodeur->IC2Prescaler = TIM_ICPSC_DIV1;
xav_jann1 0:1cfd66c3a181 79 encodeur->IC2Selection = TIM_ICSELECTION_DIRECTTI;
xav_jann1 0:1cfd66c3a181 80
xav_jann1 0:1cfd66c3a181 81 if (HAL_TIM_Encoder_Init(timer, encodeur) != HAL_OK) {
xav_jann1 0:1cfd66c3a181 82 printf("Couldn't Init Encoder\r\n");
xav_jann1 0:1cfd66c3a181 83 while (1) {}
xav_jann1 0:1cfd66c3a181 84 }
xav_jann1 0:1cfd66c3a181 85
xav_jann1 0:1cfd66c3a181 86 if (HAL_TIM_Encoder_Start(timer, TIM_CHANNEL_1)!= HAL_OK) {
xav_jann1 0:1cfd66c3a181 87 printf("Couldn't Start Encoder\r\n");
xav_jann1 0:1cfd66c3a181 88 while (1) {}
xav_jann1 0:1cfd66c3a181 89 }
xav_jann1 0:1cfd66c3a181 90
xav_jann1 0:1cfd66c3a181 91 // Active l'interruption du timer:
xav_jann1 0:1cfd66c3a181 92 HAL_TIM_Base_Start_IT(timer);
xav_jann1 0:1cfd66c3a181 93 }
xav_jann1 0:1cfd66c3a181 94
xav_jann1 0:1cfd66c3a181 95
xav_jann1 0:1cfd66c3a181 96 // Fonction d'interruptions pour compter le nombre de tours:
xav_jann1 0:1cfd66c3a181 97 extern Encodeur encodeurG, encodeurD;
xav_jann1 0:1cfd66c3a181 98 extern "C"
xav_jann1 0:1cfd66c3a181 99 {
xav_jann1 0:1cfd66c3a181 100 // Gestion de l'interruption du timer 3:
xav_jann1 0:1cfd66c3a181 101 void TIM3_IRQHandler(void) {
xav_jann1 0:1cfd66c3a181 102 HAL_TIM_IRQHandler(&timer3);
xav_jann1 0:1cfd66c3a181 103
xav_jann1 0:1cfd66c3a181 104 // Récupère la direction de rotation de l'encodeur:
xav_jann1 0:1cfd66c3a181 105 bool direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&timer3);
xav_jann1 0:1cfd66c3a181 106
xav_jann1 0:1cfd66c3a181 107 // Ajoute ou enlève un tour:
xav_jann1 0:1cfd66c3a181 108 encodeurG.updateTour(direction ? -1 : 1);
xav_jann1 0:1cfd66c3a181 109 }
xav_jann1 0:1cfd66c3a181 110
xav_jann1 0:1cfd66c3a181 111 // Gestion de l'interruption du timer 4:
xav_jann1 0:1cfd66c3a181 112 void TIM4_IRQHandler(void) {
xav_jann1 0:1cfd66c3a181 113 HAL_TIM_IRQHandler(&timer4);
xav_jann1 0:1cfd66c3a181 114
xav_jann1 0:1cfd66c3a181 115 // Récupère la direction de rotation de l'encodeur:
xav_jann1 0:1cfd66c3a181 116 bool direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&timer4);
xav_jann1 0:1cfd66c3a181 117
xav_jann1 0:1cfd66c3a181 118 // Ajoute ou enlève un tour:
xav_jann1 0:1cfd66c3a181 119 encodeurD.updateTour(direction ? -1 : 1);
xav_jann1 0:1cfd66c3a181 120 }
xav_jann1 0:1cfd66c3a181 121 }