Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Capteurs/Encodeur.cpp@0:1cfd66c3a181, 2019-05-22 (annotated)
- Committer:
- xav_jann1
- Date:
- Wed May 22 16:54:27 2019 +0000
- Revision:
- 0:1cfd66c3a181
Premiere version
Who changed what in which revision?
User | Revision | Line number | New 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 | } |