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.
pwm_input/pwmin.cpp@1:4c4653623690, 2018-05-12 (annotated)
- Committer:
- himarsmty
- Date:
- Sat May 12 07:28:03 2018 +0000
- Revision:
- 1:4c4653623690
- Parent:
- 0:528f6a3352b9
c
Who changed what in which revision?
User | Revision | Line number | New 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 | } |