tianyun ma / Mbed 2 deprecated my_auto_mobi

Dependencies:   QEI mbed

Committer:
himarsmty
Date:
Sat May 12 07:28:03 2018 +0000
Revision:
1:4c4653623690
Parent:
0:528f6a3352b9
c

Who changed what in which revision?

UserRevisionLine numberNew contents of line
himarsmty 0:528f6a3352b9 1 /***************************************************************
himarsmty 0:528f6a3352b9 2 功能 : 航模接收机PWM脉宽测量程序
himarsmty 0:528f6a3352b9 3 作者 : 王若溪
himarsmty 0:528f6a3352b9 4 邮箱 : thuwrx10[at]gmail[dot]com
himarsmty 0:528f6a3352b9 5 声明 :
himarsmty 0:528f6a3352b9 6 本程序仅供学习与交流使用,如需他用,须联系作者
himarsmty 0:528f6a3352b9 7 本程序可以随意更改,但须保留本信息页
himarsmty 0:528f6a3352b9 8 All rights reserved
himarsmty 0:528f6a3352b9 9 2018.5.2
himarsmty 0:528f6a3352b9 10 ***************************************************************/
himarsmty 0:528f6a3352b9 11
himarsmty 0:528f6a3352b9 12 #include "pwmin.h"
himarsmty 0:528f6a3352b9 13
himarsmty 0:528f6a3352b9 14 extern Serial pc;
himarsmty 0:528f6a3352b9 15 const uint16_t timerPeriod = 40000 - 1; // 单位为微秒,实际数字减1
himarsmty 0:528f6a3352b9 16 const int16_t widthUpperBound = 2200;
himarsmty 0:528f6a3352b9 17 const int16_t widthLowerBound = 800;
himarsmty 0:528f6a3352b9 18
himarsmty 0:528f6a3352b9 19 int16_t tim3IC1Width=0; //定时器3通道1脉宽,单位为微秒
himarsmty 0:528f6a3352b9 20 int16_t tim3IC2Width=0; //定时器3通道2脉宽
himarsmty 0:528f6a3352b9 21 int16_t tim3IC3Width=0; //定时器3通道3脉宽
himarsmty 0:528f6a3352b9 22 int16_t tim3IC4Width=0; //定时器3通道4脉宽
himarsmty 0:528f6a3352b9 23 int16_t tim1IC2Width=0;
himarsmty 0:528f6a3352b9 24 int16_t tim1IC3Width=0;
himarsmty 0:528f6a3352b9 25
himarsmty 0:528f6a3352b9 26 TIM_HandleTypeDef htim1, htim3;
himarsmty 0:528f6a3352b9 27 //
himarsmty 0:528f6a3352b9 28
himarsmty 0:528f6a3352b9 29 void TIM1_3_Config(void)
himarsmty 0:528f6a3352b9 30 {
himarsmty 0:528f6a3352b9 31
himarsmty 0:528f6a3352b9 32 TIM_IC_InitTypeDef TIM_ICInitStructure;
himarsmty 0:528f6a3352b9 33
himarsmty 0:528f6a3352b9 34 htim3.Instance = TIM3;
himarsmty 0:528f6a3352b9 35 htim3.Init.Period = timerPeriod;
himarsmty 0:528f6a3352b9 36 htim3.Init.Prescaler = (uint16_t) (SystemCoreClock / 1000000) - 1; //1微秒
himarsmty 0:528f6a3352b9 37 htim3.Init.ClockDivision = 0;
himarsmty 0:528f6a3352b9 38 htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
himarsmty 0:528f6a3352b9 39 HAL_TIM_IC_Init(&htim3);
himarsmty 0:528f6a3352b9 40
himarsmty 0:528f6a3352b9 41 TIM_ICInitStructure.ICPolarity = TIM_ICPOLARITY_FALLING;
himarsmty 0:528f6a3352b9 42 TIM_ICInitStructure.ICSelection = TIM_ICSELECTION_DIRECTTI;
himarsmty 0:528f6a3352b9 43 TIM_ICInitStructure.ICPrescaler = TIM_ICPSC_DIV1;
himarsmty 0:528f6a3352b9 44 TIM_ICInitStructure.ICFilter = 0x0;
himarsmty 0:528f6a3352b9 45 HAL_TIM_IC_ConfigChannel(&htim3, &TIM_ICInitStructure, TIM_CHANNEL_1); //配置各个通道的极性等
himarsmty 0:528f6a3352b9 46 HAL_TIM_IC_ConfigChannel(&htim3, &TIM_ICInitStructure, TIM_CHANNEL_2);
himarsmty 0:528f6a3352b9 47 HAL_TIM_IC_ConfigChannel(&htim3, &TIM_ICInitStructure, TIM_CHANNEL_3);
himarsmty 0:528f6a3352b9 48 HAL_TIM_IC_ConfigChannel(&htim3, &TIM_ICInitStructure, TIM_CHANNEL_4);
himarsmty 0:528f6a3352b9 49
himarsmty 0:528f6a3352b9 50 HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1); //使能各通道的输入捕获中断
himarsmty 0:528f6a3352b9 51 HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2);
himarsmty 0:528f6a3352b9 52 HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_3);
himarsmty 0:528f6a3352b9 53 HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_4);
himarsmty 0:528f6a3352b9 54
himarsmty 0:528f6a3352b9 55 htim1.Instance = TIM1; //换成TIM1再来一遍
himarsmty 0:528f6a3352b9 56 htim1.Init.Period = timerPeriod;
himarsmty 0:528f6a3352b9 57 htim1.Init.Prescaler = (uint16_t) (SystemCoreClock / 1000000) - 1; //1微秒
himarsmty 0:528f6a3352b9 58 htim1.Init.ClockDivision = 0;
himarsmty 0:528f6a3352b9 59 htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
himarsmty 0:528f6a3352b9 60 HAL_TIM_IC_Init(&htim1);
himarsmty 0:528f6a3352b9 61 HAL_TIM_IC_ConfigChannel(&htim1, &TIM_ICInitStructure, TIM_CHANNEL_2);
himarsmty 0:528f6a3352b9 62 HAL_TIM_IC_ConfigChannel(&htim1, &TIM_ICInitStructure, TIM_CHANNEL_3);
himarsmty 0:528f6a3352b9 63 HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_2);
himarsmty 0:528f6a3352b9 64 HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_3);
himarsmty 0:528f6a3352b9 65 }
himarsmty 0:528f6a3352b9 66
himarsmty 0:528f6a3352b9 67 void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) //自己定义此函数,这个函数已在别处声明,会被HAL_TIM_IC_Init调用。
himarsmty 0:528f6a3352b9 68 {
himarsmty 0:528f6a3352b9 69 GPIO_InitTypeDef GPIO_InitStructure;
himarsmty 0:528f6a3352b9 70 if (htim->Instance == TIM3)
himarsmty 0:528f6a3352b9 71 {
himarsmty 0:528f6a3352b9 72 __HAL_RCC_TIM3_CLK_ENABLE();
himarsmty 0:528f6a3352b9 73 __HAL_RCC_GPIOA_CLK_ENABLE();
himarsmty 0:528f6a3352b9 74 __HAL_RCC_GPIOB_CLK_ENABLE();
himarsmty 0:528f6a3352b9 75
himarsmty 0:528f6a3352b9 76 GPIO_InitStructure.Pin = GPIO_PIN_6 | GPIO_PIN_7;
himarsmty 0:528f6a3352b9 77 GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
himarsmty 0:528f6a3352b9 78 GPIO_InitStructure.Pull = GPIO_PULLDOWN;
himarsmty 0:528f6a3352b9 79 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
himarsmty 0:528f6a3352b9 80 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
himarsmty 0:528f6a3352b9 81
himarsmty 0:528f6a3352b9 82 GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1;
himarsmty 0:528f6a3352b9 83 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
himarsmty 0:528f6a3352b9 84
himarsmty 0:528f6a3352b9 85 HAL_NVIC_SetPriority(TIM3_IRQn, 1, 0);
himarsmty 0:528f6a3352b9 86 HAL_NVIC_EnableIRQ(TIM3_IRQn);
himarsmty 0:528f6a3352b9 87 }
himarsmty 0:528f6a3352b9 88
himarsmty 0:528f6a3352b9 89 if (htim->Instance == TIM1)
himarsmty 0:528f6a3352b9 90 {
himarsmty 0:528f6a3352b9 91 __HAL_RCC_TIM1_CLK_ENABLE();
himarsmty 0:528f6a3352b9 92 __HAL_RCC_GPIOA_CLK_ENABLE();
himarsmty 0:528f6a3352b9 93
himarsmty 0:528f6a3352b9 94 GPIO_InitStructure.Pin = GPIO_PIN_9 | GPIO_PIN_10;
himarsmty 0:528f6a3352b9 95 GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
himarsmty 0:528f6a3352b9 96 GPIO_InitStructure.Pull = GPIO_PULLDOWN;
himarsmty 0:528f6a3352b9 97 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
himarsmty 0:528f6a3352b9 98 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
himarsmty 0:528f6a3352b9 99
himarsmty 0:528f6a3352b9 100 HAL_NVIC_SetPriority(TIM1_CC_IRQn, 2, 0);
himarsmty 0:528f6a3352b9 101 HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);
himarsmty 0:528f6a3352b9 102 }
himarsmty 0:528f6a3352b9 103 }
himarsmty 0:528f6a3352b9 104
himarsmty 0:528f6a3352b9 105 //自己实现一个名为HAL_TIM_IC_CaptureCallback的函数。它要被HAL_TIM_IRQHandler调用。
himarsmty 0:528f6a3352b9 106 //另外需要将HAL_TIM_IRQHandler加入相关的中断处理函数中,见stm32f1xx_it.c
himarsmty 0:528f6a3352b9 107 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
himarsmty 0:528f6a3352b9 108 {
himarsmty 0:528f6a3352b9 109 static int16_t temp;
himarsmty 0:528f6a3352b9 110 static uint16_t tim1PrevIC2Value, tim1PrevIC3Value, tim3PrevIC1Value, tim3PrevIC2Value, tim3PrevIC3Value, tim3PrevIC4Value; //上升沿时计数器的值
himarsmty 0:528f6a3352b9 111 static uint16_t tim1CurIC2Value, tim1CurIC3Value, tim3CurIC1Value, tim3CurIC2Value, tim3CurIC3Value, tim3CurIC4Value; // 下降沿时计数器的值
himarsmty 0:528f6a3352b9 112
himarsmty 0:528f6a3352b9 113 if (htim->Instance == TIM1)
himarsmty 0:528f6a3352b9 114 {
himarsmty 0:528f6a3352b9 115 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
himarsmty 0:528f6a3352b9 116 {
himarsmty 0:528f6a3352b9 117 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);
himarsmty 0:528f6a3352b9 118 if(!(TIM1->CCER & 0x0020)) // 发生了上升沿
himarsmty 0:528f6a3352b9 119 {
himarsmty 0:528f6a3352b9 120 tim1PrevIC2Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
himarsmty 0:528f6a3352b9 121 TIM1->CCER |= 0x0020; // 改为下降沿触发以迎接下降沿
himarsmty 0:528f6a3352b9 122 }
himarsmty 0:528f6a3352b9 123 else
himarsmty 0:528f6a3352b9 124 {
himarsmty 0:528f6a3352b9 125 tim1CurIC2Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
himarsmty 0:528f6a3352b9 126 temp = tim1CurIC2Value - tim1PrevIC2Value;
himarsmty 0:528f6a3352b9 127 if (temp < 0) // 上升沿和下降沿之间计数器走完了一个循环
himarsmty 0:528f6a3352b9 128 temp += timerPeriod;
himarsmty 0:528f6a3352b9 129 if (temp > widthLowerBound && temp < widthUpperBound) // 检查是否超限
himarsmty 0:528f6a3352b9 130 tim1IC2Width=temp;
himarsmty 0:528f6a3352b9 131
himarsmty 0:528f6a3352b9 132 // Tim3_ser1.printf("tim1IC2Width:%f\ttim1IC3Width:%f\n",tim1IC2Width,tim1IC3Width);
himarsmty 0:528f6a3352b9 133
himarsmty 0:528f6a3352b9 134 TIM1->CCER &= ~0x0020; // 改回上升沿触发
himarsmty 0:528f6a3352b9 135 }
himarsmty 0:528f6a3352b9 136 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);
himarsmty 0:528f6a3352b9 137 }
himarsmty 0:528f6a3352b9 138
himarsmty 0:528f6a3352b9 139 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
himarsmty 0:528f6a3352b9 140 {
himarsmty 0:528f6a3352b9 141 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3);
himarsmty 0:528f6a3352b9 142 if(!(TIM1->CCER & 0x0200)) // Rising Edge
himarsmty 0:528f6a3352b9 143 {
himarsmty 0:528f6a3352b9 144 tim1PrevIC3Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
himarsmty 0:528f6a3352b9 145 TIM1->CCER |= 0x0200;
himarsmty 0:528f6a3352b9 146 }
himarsmty 0:528f6a3352b9 147 else
himarsmty 0:528f6a3352b9 148 {
himarsmty 0:528f6a3352b9 149 tim1CurIC3Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
himarsmty 0:528f6a3352b9 150 temp = tim1CurIC3Value - tim1PrevIC3Value;
himarsmty 0:528f6a3352b9 151 if (temp < 0) // 上升沿和下降沿之间计数器走完了一个循环
himarsmty 0:528f6a3352b9 152 temp += timerPeriod;
himarsmty 0:528f6a3352b9 153 if (temp > widthLowerBound && temp < widthUpperBound)
himarsmty 0:528f6a3352b9 154 tim1IC3Width=temp;
himarsmty 0:528f6a3352b9 155 // Tim3_ser1.printf("tim1IC2Width:%f\ttim1IC3Width:%f\n",tim1IC2Width,tim1IC3Width);
himarsmty 0:528f6a3352b9 156 TIM1->CCER &= ~0x0200;
himarsmty 0:528f6a3352b9 157 }
himarsmty 0:528f6a3352b9 158 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3);
himarsmty 0:528f6a3352b9 159 }
himarsmty 0:528f6a3352b9 160
himarsmty 0:528f6a3352b9 161 }
himarsmty 0:528f6a3352b9 162
himarsmty 0:528f6a3352b9 163 if (htim->Instance == TIM3)
himarsmty 0:528f6a3352b9 164 {
himarsmty 0:528f6a3352b9 165 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
himarsmty 0:528f6a3352b9 166 {
himarsmty 0:528f6a3352b9 167 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);
himarsmty 0:528f6a3352b9 168 if(!(TIM3->CCER & 0x0002)) // Rising Edge
himarsmty 0:528f6a3352b9 169 {
himarsmty 0:528f6a3352b9 170 tim3PrevIC1Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
himarsmty 0:528f6a3352b9 171 TIM3->CCER |= 0x0002;
himarsmty 0:528f6a3352b9 172 }
himarsmty 0:528f6a3352b9 173 else
himarsmty 0:528f6a3352b9 174 {
himarsmty 0:528f6a3352b9 175 tim3CurIC1Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
himarsmty 0:528f6a3352b9 176 temp = tim3CurIC1Value - tim3PrevIC1Value;
himarsmty 0:528f6a3352b9 177 if (temp < 0) // 上升沿和下降沿之间计数器走完了一个循环
himarsmty 0:528f6a3352b9 178 temp += timerPeriod;
himarsmty 0:528f6a3352b9 179 if (temp > widthLowerBound && temp < widthUpperBound)
himarsmty 0:528f6a3352b9 180 tim3IC1Width=temp;
himarsmty 0:528f6a3352b9 181 // Tim3_ser1.printf("tim3IC1Width:%f\ttim3IC2Width:%f\n",tim3IC1Width,tim3IC2Width);
himarsmty 0:528f6a3352b9 182 TIM3->CCER &= ~0x0002;
himarsmty 0:528f6a3352b9 183 }
himarsmty 0:528f6a3352b9 184 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
himarsmty 0:528f6a3352b9 185 }
himarsmty 0:528f6a3352b9 186
himarsmty 0:528f6a3352b9 187 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
himarsmty 0:528f6a3352b9 188 {
himarsmty 0:528f6a3352b9 189 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);
himarsmty 0:528f6a3352b9 190 if(!(TIM3->CCER & 0x0020)) // Rising Edge
himarsmty 0:528f6a3352b9 191 {
himarsmty 0:528f6a3352b9 192 tim3PrevIC2Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
himarsmty 0:528f6a3352b9 193 TIM3->CCER |= 0x0020;
himarsmty 0:528f6a3352b9 194 }
himarsmty 0:528f6a3352b9 195 else
himarsmty 0:528f6a3352b9 196 {
himarsmty 0:528f6a3352b9 197 tim3CurIC2Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
himarsmty 0:528f6a3352b9 198 temp = tim3CurIC2Value - tim3PrevIC2Value;
himarsmty 0:528f6a3352b9 199 if (temp < 0) // 上升沿和下降沿之间计数器走完了一个循环
himarsmty 0:528f6a3352b9 200 temp += timerPeriod;
himarsmty 0:528f6a3352b9 201 if (temp > widthLowerBound && temp < widthUpperBound)
himarsmty 0:528f6a3352b9 202 tim3IC2Width=temp;
himarsmty 0:528f6a3352b9 203 // Tim3_ser1.printf("tim3IC1Width:%f\ttim3IC2Width:%f\n",tim3IC1Width,tim3IC2Width);
himarsmty 0:528f6a3352b9 204 TIM3->CCER &= ~0x0020;
himarsmty 0:528f6a3352b9 205 }
himarsmty 0:528f6a3352b9 206 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);
himarsmty 0:528f6a3352b9 207 }
himarsmty 0:528f6a3352b9 208
himarsmty 0:528f6a3352b9 209 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
himarsmty 0:528f6a3352b9 210 {
himarsmty 0:528f6a3352b9 211 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3);
himarsmty 0:528f6a3352b9 212 if(!(TIM3->CCER & 0x0200)) // Rising Edge
himarsmty 0:528f6a3352b9 213 {
himarsmty 0:528f6a3352b9 214 tim3PrevIC3Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
himarsmty 0:528f6a3352b9 215 TIM3->CCER |= 0x0200;
himarsmty 0:528f6a3352b9 216 }
himarsmty 0:528f6a3352b9 217 else
himarsmty 0:528f6a3352b9 218 {
himarsmty 0:528f6a3352b9 219 tim3CurIC3Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
himarsmty 0:528f6a3352b9 220 temp = tim3CurIC3Value - tim3PrevIC3Value;
himarsmty 0:528f6a3352b9 221 if (temp < 0) // 上升沿和下降沿之间计数器走完了一个循环
himarsmty 0:528f6a3352b9 222 temp += timerPeriod;
himarsmty 0:528f6a3352b9 223 if (temp > widthLowerBound && temp < widthUpperBound)
himarsmty 0:528f6a3352b9 224 tim3IC3Width=temp;
himarsmty 0:528f6a3352b9 225 // Tim3_ser1.printf("tim3IC3Width:%f\ttim3IC4Width:%f\n",tim3IC3Width,tim3IC4Width);
himarsmty 0:528f6a3352b9 226 TIM3->CCER &= ~0x0200;
himarsmty 0:528f6a3352b9 227 }
himarsmty 0:528f6a3352b9 228 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3);
himarsmty 0:528f6a3352b9 229 }
himarsmty 0:528f6a3352b9 230
himarsmty 0:528f6a3352b9 231 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)
himarsmty 0:528f6a3352b9 232 {
himarsmty 0:528f6a3352b9 233 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4);
himarsmty 0:528f6a3352b9 234 if(!(TIM3->CCER & 0x2000)) // Rising Edge
himarsmty 0:528f6a3352b9 235 {
himarsmty 0:528f6a3352b9 236 tim3PrevIC4Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_4);
himarsmty 0:528f6a3352b9 237 TIM3->CCER |= 0x2000;
himarsmty 0:528f6a3352b9 238 }
himarsmty 0:528f6a3352b9 239 else
himarsmty 0:528f6a3352b9 240 {
himarsmty 0:528f6a3352b9 241 tim3CurIC4Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_4);
himarsmty 0:528f6a3352b9 242 temp = tim3CurIC4Value - tim3PrevIC4Value;
himarsmty 0:528f6a3352b9 243 if (temp < 0) // Overflow occurred during rising edge and falling edge
himarsmty 0:528f6a3352b9 244 temp += timerPeriod;
himarsmty 0:528f6a3352b9 245 if (temp > widthLowerBound && temp < widthUpperBound)
himarsmty 0:528f6a3352b9 246 tim3IC4Width=temp;
himarsmty 0:528f6a3352b9 247 // Tim3_ser1.printf("tim3IC3Width:%f\ttim3IC4Width:%f\n",tim3IC3Width,tim3IC4Width);
himarsmty 0:528f6a3352b9 248 TIM3->CCER &= ~0x2000;
himarsmty 0:528f6a3352b9 249 }
himarsmty 0:528f6a3352b9 250 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4);
himarsmty 0:528f6a3352b9 251 }
himarsmty 0:528f6a3352b9 252 }
himarsmty 0:528f6a3352b9 253 }