当前位置: 首页 > news >正文

东菀高端网站建设网站建设申请书

东菀高端网站建设,网站建设申请书,网站的全栈建设,企业品牌战略一、高级定时器互补输出带死区控制实验 上图中#xff0c;CH1 输出黄色的 PWM#xff0c;它的互补通道 CH1N 输出绿色的 PWM。通过对比#xff0c;可以 知道这两个 PWM 刚好是反过来的#xff0c;CH1 的 PWM 为高电平期间#xff0c;CH1N 的 PWM 则是低电平#xff0c; 反…一、高级定时器互补输出带死区控制实验 上图中CH1 输出黄色的 PWM它的互补通道 CH1N 输出绿色的 PWM。通过对比可以 知道这两个 PWM 刚好是反过来的CH1 的 PWM 为高电平期间CH1N 的 PWM 则是低电平 反之亦然这就是互补输出。 上图中CH1 输出的 PWM 和 CH1N 输出的 PWM 在高低电平转换间插入了一段时间才 实现互补输出。这段时间称为死区时间可以通过 DTG[7:0]位配置控制死区时间的长度。 TIM1/TIM8 寄存器 控制寄存器 1TIMx_CR1 CKD[1:0]位指示定时器时钟CK_INT频率与死区发生器以及数字滤波器ETR、TIx 所使用的死区及采样时钟tDTS之间的分频比。我们设置 CKD[1:0]位为 10结合高级定时器 时钟源频率等于 APB2 总线时钟频率即 72MHz可以得到 tDTS55.56ns。 捕获/比较模式寄存器 1/2TIMx_CCMR1/2 捕获/比较使能寄存器TIMx_ CCER 该寄存器控制着各个输入输出通道的开关和极性 捕获/比较寄存器 1/2/3/4TIMx_CCR1/2/3/4 本实验中可以通过改变该寄存器的值来改变 PWM 的占空比。 断路和死区寄存器TIMx_ BDTR 定时器的 HAL 库驱动 1. HAL_TIMEx_ConfigBreakDeadTime 函数 HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); 函数描述 用于初始化定时器的断路即刹车和死区时间。 函数形参 形参 1 是 TIM_HandleTypeDef 结构体类型指针变量。 形参 2 是 TIM_BreakDeadTimeConfigTypeDef 结构体类型指针变量用于配置断路和死区 参数其定义如下 typedef struct { uint32_t OffStateRunMode; /* 运行模式下的关闭状态选择 */ uint32_t OffStateIDLEMode; /* 空闲模式下的关闭状态选择 */ uint32_t LockLevel; /* 寄存器锁定配置 */ uint32_t DeadTime; /* 死区时间设置 */ uint32_t BreakState; /* 断路即刹车输入使能控制 */ uint32_t BreakPolarity; /* 断路输入极性 */ uint32_t BreakFilter; /* 断路输入滤波器 */ uint32_t AutomaticOutput; /* 自动恢复输出使能控制 */ } TIM_BreakDeadTimeConfigTypeDef; 2. HAL_TIMEx_PWMN_Start 函数 HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); 函数描述 该函数用于启动定时器的互补输出。 函数形参 形参 1 是 TIM_HandleTypeDef 结构体类型指针变量用于配置定时器基本参数。 形参 2 是定时器通道范围TIM_CHANNEL_1 到 TIM_CHANNEL_4。 定时器互补输出带死区控制配置步骤 1开启 TIMx 和通道输出以及刹车输入的 GPIO 时钟配置该 IO 口的复用功能输出。 __HAL_RCC_TIM1_CLK_ENABLE(); /* 使能定时器 1 */ __HAL_RCC_GPIOE_CLK_ENABLE(); /* 开启 GPIOE 时钟 */ 2初始化 TIMx设置 TIMx 的 ARR 和 PSC 等参数 3设置定时器为 PWM 模式输出比较极性互补输出极性等参数 4设置死区参数 5启动 Ocy 输出以及 OCyN 互补输出 程序解析 atim.h /* 输出通道引脚 */ #define ATIM_TIMX_CPLM_CHY_GPIO_PORT GPIOE #define ATIM_TIMX_CPLM_CHY_GPIO_PIN GPIO_PIN_9 #define ATIM_TIMX_CPLM_CHY_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0) /* PE 口时钟使能 */ /* 互补输出通道引脚 */ #define ATIM_TIMX_CPLM_CHYN_GPIO_PORT GPIOE #define ATIM_TIMX_CPLM_CHYN_GPIO_PIN GPIO_PIN_8 #define ATIM_TIMX_CPLM_CHYN_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0) /* PE 口时钟使能 */ /* 刹车输入引脚 */ #define ATIM_TIMX_CPLM_BKIN_GPIO_PORT GPIOE #define ATIM_TIMX_CPLM_BKIN_GPIO_PIN GPIO_PIN_15 #define ATIM_TIMX_CPLM_BKIN_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0) /* PE 口时钟使能 */ /* TIMX REMAP 设置 * 因为 PE8/PE9/PE15, 默认并不是 TIM1 的复用功能脚, 必须开启完全重映射, 才可以将: TIM1_CH1-PE9; TIM1_CH1N-PE8; TIM1_BKIN-PE15; * 这样, PE8/PE9/PE15, 才能用作 TIM1 的 CH1N/CH1/BKIN 功能. * 因此必须实现 ATIM_TIMX_CPLM_CHYN_GPIO_REMAP, 通过 sys_gpio_remap_set 函数设置重映射 * 如果我们使用默认的复用功能输出, 则不用设置重映射, 是可以不需要该函数的! 根据具体需要来实现. */ #define ATIM_TIMX_CPLM_CHYN_GPIO_REMAP() do{__HAL_RCC_AFIO_CLK_ENABLE();\ __HAL_AFIO_REMAP_TIM1_ENBLE();\}while(0) /* 互补输出使用的定时器 */ #define ATIM_TIMX_CPLM TIM1 #define ATIM_TIMX_CPLM_CHY TIM_CHANNEL_1 #define ATIM_TIMX_CPLM_CHY_CCRY ATIM_TIMX_CPLM-CCR1 #define ATIM_TIMX_CPLM_CLK_ENABLE() do{ __HAL_RCC_TIM1_CLK_ENABLE(); }while(0) atim.c void atim_timx_cplm_pwm_init(uint16_t arr, uint16_t psc) { GPIO_InitTypeDef gpio_init_struct {0}; TIM_OC_InitTypeDef tim_oc_cplm_pwm {0}; ATIM_TIMX_CPLM_CLK_ENABLE(); /* TIMx 时钟使能 */ ATIM_TIMX_CPLM_CHY_GPIO_CLK_ENABLE(); /* 通道 X 对应 IO 口时钟使能 */ ATIM_TIMX_CPLM_CHYN_GPIO_CLK_ENABLE(); /* 通道 X 互补通道对应 IO 口时钟使能 */ ATIM_TIMX_CPLM_BKIN_GPIO_CLK_ENABLE(); /* 通道 X 刹车输入对应 IO 口时钟使能 */ gpio_init_struct.Pin ATIM_TIMX_CPLM_CHY_GPIO_PIN; gpio_init_struct.Mode GPIO_MODE_AF_PP; gpio_init_struct.Pull GPIO_PULLUP; gpio_init_struct.Speed GPIO_SPEED_FREQ_HIGH ; HAL_GPIO_Init(ATIM_TIMX_CPLM_CHY_GPIO_PORT, gpio_init_struct); gpio_init_struct.Pin ATIM_TIMX_CPLM_CHYN_GPIO_PIN; HAL_GPIO_Init(ATIM_TIMX_CPLM_CHYN_GPIO_PORT, gpio_init_struct); gpio_init_struct.Pin ATIM_TIMX_CPLM_BKIN_GPIO_PIN; HAL_GPIO_Init(ATIM_TIMX_CPLM_BKIN_GPIO_PORT, gpio_init_struct); ATIM_TIMX_CPLM_CHYN_GPIO_REMAP(); /* 重映射定时器 IO */ g_timx_cplm_pwm_handle.Instance ATIM_TIMX_CPLM; /* 定时器 x */ g_timx_cplm_pwm_handle.Init.Prescaler psc; /* 定时器预分频系数 */ g_timx_cplm_pwm_handle.Init.CounterMode TIM_COUNTERMODE_UP;/* 递增计数 */ g_timx_cplm_pwm_handle.Init.Period arr; /* 自动重装载值 */ /* CKD[1:0] 10, tDTS 4 * tCK_INT Ft / 4 18Mhz */ g_timx_cplm_pwm_handle.Init.ClockDivision TIM_CLOCKDIVISION_DIV4; g_timx_cplm_pwm_handle.Init.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_ENABLE; /* 使能影子寄存器 TIMx_ARR */ HAL_TIM_PWM_Init(g_timx_cplm_pwm_handle); tim_oc_cplm_pwm.OCMode TIM_OCMODE_PWM1; /* PWM 模式 1 */ tim_oc_cplm_pwm.OCPolarity TIM_OCPOLARITY_LOW; /* OCy 低电平有效 */ tim_oc_cplm_pwm.OCNPolarity TIM_OCNPOLARITY_LOW; /* OCyN 低电平有效 */ tim_oc_cplm_pwm.OCIdleState TIM_OCIDLESTATE_SET; /* 当 MOE0OCx1 */ tim_oc_cplm_pwm.OCNIdleState TIM_OCNIDLESTATE_SET;/* 当 MOE0OCxN1 */ HAL_TIM_PWM_ConfigChannel(g_timx_cplm_pwm_handle, tim_oc_cplm_pwm, ATIM_TIMX_CPLM_CHY); /* 设置死区参数开启死区中断 */ /* 运行模式的关闭输出状态 */ g_sbreak_dead_time_config.OffStateRunMode TIM_OSSR_DISABLE; /* 空闲模式的关闭输出状态 */ g_sbreak_dead_time_config.OffStateIDLEMode TIM_OSSI_DISABLE; g_sbreak_dead_time_config.LockLevel TIM_LOCKLEVEL_OFF;/* 不用寄存器锁功能 */ g_sbreak_dead_time_config.BreakState TIM_BREAK_ENABLE;/* 使能刹车输入 */ /* 刹车输入有效信号极性为高 */ g_sbreak_dead_time_config.BreakPolarity TIM_BREAKPOLARITY_HIGH; /* 使能 AOE 位允许刹车结束后自动恢复输出 */ g_sbreak_dead_time_config.AutomaticOutput TIM_AUTOMATICOUTPUT_ENABLE; HAL_TIMEx_ConfigBreakDeadTime(g_timx_cplm_pwm_handle, g_sbreak_dead_time_config); /* 使能 OCy 输出 */ HAL_TIM_PWM_Start(g_timx_cplm_pwm_handle, ATIM_TIMX_CPLM_CHY); /* 使能 OCyN 输出 */ HAL_TIMEx_PWMN_Start(g_timx_cplm_pwm_handle, ATIM_TIMX_CPLM_CHY); } 在 atim_timx_cplm_pwm_init 函数中没有使用 HAL 库的 MSP 回调而是把相关的初始化 都写到该函数里面。 第一部分使能定时器和相关通道对应的 GPIO 时钟以及初始化相关 IO 引脚。 第二部分通过 HAL_TIM_PWM_Init 函数初始化定时器的 ARR 和 PSC 等参数。 第三部分通过 HAL_TIM_PWM_ConfigChannel 函数设置 PWM 模式 1、输出极性以及 输出空闲状态等。 第四部分通过 HAL_TIMEx_ConfigBreakDeadTime 函数配置断路功能。 最后一定记得要调用 HAL_TIM_PWM_Start 函数和 HAL_TIMEx_PWMN_Start 函数启动通 道输出和互补通道输出。 为了方便我们还定义了设置输出比较值和死区时间的函数其定义如下 void atim_timx_cplm_pwm_set(uint16_t ccr, uint8_t dtg) { g_sbreak_dead_time_config.DeadTime dtg; /* 死区时间设置 */ HAL_TIMEx_ConfigBreakDeadTime(g_timx_cplm_pwm_handle, g_sbreak_dead_time_config); /*重设死区时间*/ __HAL_TIM_MOE_ENABLE(g_timx_cplm_pwm_handle); /* MOE1,使能主输出 */ ATIM_TIMX_CPLM_CHY_CCRY ccr; /* 设置比较寄存器 */ } main.c int main(void) { uint8_t t 0; HAL_Init(); /* 初始化 HAL 库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ usart_init(115200); /* 串口初始化为 115200 */ led_init(); /* 初始化 LED */ atim_timx_cplm_pwm_init(1000 - 1, 72 - 1); /* 1Mhz 的计数频率 1Khz 的周期. */ atim_timx_cplm_pwm_set(300, 100); /* 占空比:7:3, 死区时间 100*tDTS */ while (1) { delay_ms(10); t; if (t 20) { LED0_TOGGLE(); /* LED0(RED)闪烁 */ t 0; } } } 二、高级定时器 PWM 输入模式实验  第一确定定时器时钟源。 第二确定 PWM 输入的通道。 第三确定 IC1 和 IC2 的捕获边沿。 第四选择触发输入信号TRGI。 第五从模式选择复位模式。复位模式的作用是在出现所选触发输入 (TRGI) 上升沿 时重新初始化计数器并生成一个寄存器更新事件。 第六读取一个 PWM 周期内计数器的计数个数以及高电平期间的计数个数再结合计 数器的计数周期即计一个数的时间最终通过计算得到输入的 PWM 周期和占空比等参数。 从模式控制寄存器TIMx_SMCR 捕获/比较模式寄存器 1/2TIMx_CCMR1/2 捕获/比较使能寄存器TIMx_ CCER  捕获/比较寄存器 1/2/3/4TIMx_CCR1/2/3/4   DMA/中断使能寄存器TIMx_DIER  高级定时器 PWM 输入模式配置步骤   1开启 TIMx 和输入通道的 GPIO 时钟配置该 IO 口的复用功能输入。  2 初始化 TIMx设置 TIMx 的 ARR 和 PSC 等参数。 3从模式配置IT1 触发更新  4设置 IC1 捕获相关参数  5设置 IC2 捕获相关参数  6使能定时器更新中断开启捕获功能配置定时器中断优先级 atim.h #define ATIM_TIMX_PWMIN_CHY_GPIO_PORT GPIOC #define ATIM_TIMX_PWMIN_CHY_GPIO_PIN GPIO_PIN_6 #define ATIM_TIMX_PWMIN_CHY_GPIO_CLK_ENABLE() do{__HAL_RCC_GPIOC_CLK_ENABLE();\ }while(0) /* PC 口时钟使能 */ #define ATIM_TIMX_PWMIN TIM8 #define ATIM_TIMX_PWMIN_IRQn TIM8_UP_IRQn #define ATIM_TIMX_PWMIN_IRQHandler TIM8_UP_IRQHandler #define ATIM_TIMX_PWMIN_CHY TIM_CHANNEL_1 /* 通道 Y, 1 Y 2*/ #define ATIM_TIMX_PWMIN_CHY_CLK_ENABLE() do{ __HAL_RCC_TIM8_CLK_ENABLE(); }while(0) /* TIM8 时钟使能 */ /* TIM1 / TIM8 有独立的捕获中断服务函数,需要单独定义,对于 TIM2~5 等,则不需要以下定义 */ #define ATIM_TIMX_PWMIN_CC_IRQn TIM8_CC_IRQn #define ATIM_TIMX_PWMIN_CC_IRQHandler TIM8_CC_IRQHandler atim.c void atim_timx_pwmin_chy_init(void) { { GPIO_InitTypeDef gpio_init_struct {0}; TIM_SlaveConfigTypeDef slave_config {0}; TIM_IC_InitTypeDef tim_ic_pwmin_chy {0}; ATIM_TIMX_PWMIN_CHY_CLK_ENABLE(); ATIM_TIMX_PWMIN_CHY_GPIO_CLK_ENABLE(); __HAL_RCC_AFIO_CLK_ENABLE(); AFIO_REMAP_PARTIAL(AFIO_EVCR_PORT_PC,AFIO_EVCR_PIN_PX6);/*复用 TIM8_CH1/PC6*/ gpio_init_struct.Pin ATIM_TIMX_PWMIN_CHY_GPIO_PIN; gpio_init_struct.Mode GPIO_MODE_AF_PP; gpio_init_struct.Pull GPIO_PULLDOWN; gpio_init_struct.Speed GPIO_SPEED_FREQ_HIGH ; HAL_GPIO_Init(ATIM_TIMX_PWMIN_CHY_GPIO_PORT, gpio_init_struct); g_timx_pwmin_chy_handle.Instance ATIM_TIMX_PWMIN; /* 定时器 8 */ g_timx_pwmin_chy_handle.Init.Prescaler 0; /* 定时器预分频系数 */ g_timx_pwmin_chy_handle.Init.CounterMode TIM_COUNTERMODE_UP;/* 递增计数 */ g_timx_pwmin_chy_handle.Init.Period 65535; /* 自动重装载值 */ HAL_TIM_IC_Init(g_timx_pwmin_chy_handle); /* 从模式配置IT1 触发更新 */ slave_config.SlaveMode TIM_SLAVEMODE_RESET; /* 从模式复位模式 */ slave_config.InputTrigger TIM_TS_TI1FP1; /* 定时器输入触发源TI1FP1 */ slave_config.TriggerPolarity TIM_INPUTCHANNELPOLARITY_RISING;/*上升沿检测*/ slave_config.TriggerFilter 0; /* 不滤波 */ HAL_TIM_SlaveConfigSynchro(g_timx_pwmin_chy_handle, slave_config); /* IC1 捕获上升沿触发 TI1FP1 */ tim_ic_pwmin_chy.ICPolarity TIM_INPUTCHANNELPOLARITY_RISING;/* 上升沿检测 */ tim_ic_pwmin_chy.ICSelection TIM_ICSELECTION_DIRECTTI;/* IC1 映射到 TI1 上 */ tim_ic_pwmin_chy.ICPrescaler TIM_ICPSC_DIV1; /* 不分频 */ tim_ic_pwmin_chy.ICFilter 0; /* 不滤波 */ HAL_TIM_IC_ConfigChannel(g_timx_pwmin_chy_handle, tim_ic_pwmin_chy, TIM_CHANNEL_1 ); /* IC2 捕获上升沿触发 TI1FP2 */ tim_ic_pwmin_chy.ICPolarity TIM_INPUTCHANNELPOLARITY_FALLING;/*下降沿检测*/ tim_ic_pwmin_chy.ICSelection TIM_ICSELECTION_INDIRECTTI;/*IC2 映射到 TI1 上*/ HAL_TIM_IC_ConfigChannel(g_timx_pwmin_chy_handle, tim_ic_pwmin_chy, TIM_CHANNEL_2); /* 设置中断优先级抢占优先级 1子优先级 3 */ HAL_NVIC_SetPriority(ATIM_TIMX_PWMIN_IRQn, 1, 3); HAL_NVIC_EnableIRQ( ATIM_TIMX_PWMIN_IRQn ); /* 开启 TIMx 中断 */ /* TIM1/TIM8 有独立的输入捕获中断服务函数 */ if ( ATIM_TIMX_PWMIN TIM1 || ATIM_TIMX_PWMIN TIM8) { /* 设置中断优先级抢占优先级 1子优先级 3 */ HAL_NVIC_SetPriority(ATIM_TIMX_PWMIN_CC_IRQn, 1, 3); HAL_NVIC_EnableIRQ(ATIM_TIMX_PWMIN_CC_IRQn); /* 开启 TIMx 中断 */ } __HAL_TIM_ENABLE_IT(g_timx_pwmin_chy_handle, TIM_IT_UPDATE); HAL_TIM_IC_Start_IT(g_timx_pwmin_chy_handle, TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(g_timx_pwmin_chy_handle, TIM_CHANNEL_2); } 在 atim_timx_pwmin_chy_init 函数中没有使用 HAL 库的 MSP 回调而是把相关的初始 化都写到该函数里面。 第一部分使能定时器和相关通道对应的 GPIO 时钟以及初始化相关 IO 引脚。 第二部分通过 HAL_TIM_IC_Init 函数初始化定时器的 ARR 和 PSC 等参数。 第三部分通过 HAL_TIM_SlaveConfigSynchronization 函数配置从模式复位模式等。 第四部分通过 HAL_TIM_IC_ConfigChannel 函数分别配置 IC1 和 IC2。 第五部分配置 NVIC如使能定时器中断配置抢占优先级和响应优先级。 最后通过调用 HAL_TIM_IC_Start_IT 函数和__HAL_TIM_ENABLE_IT 函数宏使能捕获 中断和更新中断并且使能定时器。 为了方便我们定义了重新启动捕获函数其定义如下 void atim_timx_pwmin_chy_restart(void) { sys_intx_disable(); /* 关闭中断 */ g_timxchy_pwmin_sta 0; /* 清零状态,重新开始检测 */ g_timxchy_pwmin_psc 0; /* 分频系数清零 */ /* 以最大的计数频率采集,以得到最好的精度 */ __HAL_TIM_SET_PRESCALER(g_timx_pwmin_chy_handle, 0); __HAL_TIM_SET_COUNTER(g_timx_pwmin_chy_handle, 0); /* 计数器清零 */ __HAL_TIM_ENABLE_IT(g_timx_pwmin_chy_handle, TIM_IT_CC1);/* 使能捕获中断 */ __HAL_TIM_ENABLE_IT(g_timx_pwmin_chy_handle, TIM_IT_UPDATE);/*使能更新中断*/ __HAL_TIM_ENABLE(g_timx_pwmin_chy_handle); /* 使能定时器 TIMX */ ATIM_TIMX_PWMIN-SR 0; /* 清除所有中断标志位 */ sys_intx_enable(); /* 打开中断 */ } 该函数首先关闭所有中断然后把一些状态标志位清零、设置定时器预分频系数、计数器 值、使能相关中断、以及清除相关中断标志位最后才允许被中断。 最后要介绍的是中断服务函数在定时器1的输入捕获中断服务函数TIM1_CC_IRQHandler 和更新中断服务函数 TIM1_UP_IRQHandler 里面都是直接调用atim_timx_pwmin_chy_process函 数。输入捕获中断服务函数和更新中断服务函数都是用到宏定义的这三个函数定义如下 /** * brief 定时器 TIMX 更新/溢出 中断服务函数 * note TIM1/TIM8 的这个函数仅用于更新/溢出中断服务,捕获在另外一个函数! * 其他普通定时器则更新/溢出/捕获,都在这个函数里面处理! * param 无 * retval 无 */ void ATIM_TIMX_PWMIN_IRQHandler(void) { atim_timx_pwmin_chy_process(); } /** * brief 定时器 TIMX 输入捕获 中断服务函数 * note 仅 TIM1/TIM8 有这个函数,其他普通定时器没有这个中断服务函数! * param 无 * retval 无 */ void ATIM_TIMX_PWMIN_CC_IRQHandler(void) { atim_timx_pwmin_chy_process(); } /** * brief 定时器 TIMX 通道 Y PWM 输入模式 中断处理函数 * note * 因为 TIM1/TIM8 等有多个中断服务函数,而 TIM2~5/TIM12/TIM15 等普通定时器只有 1 个中断服务 * 函数,为了更好的兼容,我们对中断处理统一放到 atim_timx_pwin_chy_process 函数里面进行处理 * * param 无 * retval 无 */ static void atim_timx_pwmin_chy_process(void) { static uint8_t sflag 0; /* 启动 PWMIN 输入检测标志 */ if (g_timxchy_pwmin_sta) { g_timxchy_pwmin_psc 0; ATIM_TIMX_PWMIN-SR 0; /* 清除所有中断标志位 */ __HAL_TIM_SET_COUNTER(g_timx_pwmin_chy_handle, 0); /* 计数器清零 */ return ; } /* 如果发生了更新中断 */ if (__HAL_TIM_GET_FLAG(g_timx_pwmin_chy_handle, TIM_FLAG_UPDATE)) { /* 清除更新中断标记 */ __HAL_TIM_CLEAR_FLAG(g_timx_pwmin_chy_handle, TIM_FLAG_UPDATE); /* 没有发生周期捕获中断,且捕获未完成 */ if (__HAL_TIM_GET_FLAG(g_timx_pwmin_chy_handle, TIM_FLAG_CC1) 0) {sflag 0; if (g_timxchy_pwmin_psc 0) /* 从 0 到 1 */ { g_timxchy_pwmin_psc ; } else { if (g_timxchy_pwmin_psc 65535) /* 已经最大了,可能是无输入状态 */ { g_timxchy_pwmin_psc 0; /* 重新恢复不分频 */ } else if (g_timxchy_pwmin_psc 32767)/* 不能倍增了 */ { g_timxchy_pwmin_psc 65535; /* 直接等于最大分频系数 */ } else { g_timxchy_pwmin_psc g_timxchy_pwmin_psc; /* 倍增 */ } } __HAL_TIM_SET_PRESCALER(g_timx_pwmin_chy_handle, g_timxchy_pwmin_psc); /* 设置定时器预分频系数 */ __HAL_TIM_SET_COUNTER(g_timx_pwmin_chy_handle, 0); /* 计数器清零 */ ATIM_TIMX_PWMIN-SR 0; /* 清除所有中断标志位 */ return ; } } if (sflag 0) /* 第一次采集到捕获中断 */ { /* 检测到了第一次周期捕获中断 */ if (__HAL_TIM_GET_FLAG(g_timx_pwmin_chy_handle, TIM_FLAG_CC1)) { sflag 1; /* 标记第一次周期已经捕获, 第二次周期捕获可以开始了 */ } ATIM_TIMX_PWMIN-SR 0; /* 清除所有中断标志位 */ return ; /* 完成此次操作 */ } if (g_timxchy_pwmin_sta 0)/* 还没有成功捕获 */ { /* 检测到了周期捕获中断 */ if (__HAL_TIM_GET_FLAG(g_timx_pwmin_chy_handle, TIM_FLAG_CC1)) { g_timxchy_pwmin_hval HAL_TIM_ReadCapturedValue( g_timx_pwmin_chy_handle, TIM_CHANNEL_2) 1; /* 高定平脉宽捕获值 */ g_timxchy_pwmin_cval HAL_TIM_ReadCapturedValue( g_timx_pwmin_chy_handle, TIM_CHANNEL_1) 1; /* 周期捕获值 */ /* 高电平脉宽必定小于周期长度 */ if (g_timxchy_pwmin_hval g_timxchy_pwmin_cval) { g_timxchy_pwmin_sta 1; /* 标记捕获成功 */ g_timxchy_pwmin_psc ATIM_TIMX_PWMIN-PSC;/* 获取 PWM 输入分频系数 */ if (g_timxchy_pwmin_psc 0) /* 分频系数为 0 的时候, 修正读取数据 */ { g_timxchy_pwmin_hval; /* 修正系数为 1, 加 1 */ g_timxchy_pwmin_cval; /* 修正系数为 1, 加 1 */ }sflag 0; /* 每次捕获 PWM 输入成功后, 停止捕获,避免频繁中断影响系统正常代码运行 */ ATIM_TIMX_PWMIN-CR1 ~(1 0); /* 关闭定时器 TIMX */ /* 关闭通道 1 捕获中断 */ __HAL_TIM_DISABLE_IT(g_timx_pwmin_chy_handle, TIM_IT_CC1); /* 关闭通道 2 捕获中断 */ __HAL_TIM_DISABLE_IT(g_timx_pwmin_chy_handle, TIM_IT_CC2); /* 关闭更新中断 */ __HAL_TIM_DISABLE_IT(g_timx_pwmin_chy_handle, TIM_IT_UPDATE); ATIM_TIMX_PWMIN-SR 0; /* 清除所有中断标志位 */ } else { atim_timx_pwmin_chy_restart(); } } } ATIM_TIMX_PWMIN-SR 0; /* 清除所有中断标志位 */ } main.c int main(void) { uint8_t t 0; double ht, ct, f, tpsc; HAL_Init(); /* 初始化 HAL 库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ usart_init(115200); /* 串口初始化为 115200 */ led_init(); /* 初始化 LED */ gtim_timx_pwm_chy_init(10 - 1, 72 - 1); /* 1Mhz 的计数频率, 100Khz PWM */ atim_timx_pwmin_chy_init(); /* 初始化 PWM 输入捕获 */ GTIM_TIMX_PWM_CHY_CCRX 2; /* 低电平宽度 2,高电平宽度 8 */ while (1) { delay_ms(10); t; if (t 20) /* 每 200ms 输出一次结果,并闪烁 LED0,提示程序运行 */ { if (g_timxchy_pwmin_sta) /* 捕获了一次数据 */ printf(\r\n); /* 输出空,另起一行 */ printf(PWM PSC :%d\r\n, g_timxchy_pwmin_psc); /* 打印分频系数 */ printf(PWM Hight:%d\r\n, g_timxchy_pwmin_hval);/* 打印高电平脉宽 */ printf(PWM Cycle:%d\r\n, g_timxchy_pwmin_cval);/* 打印周期 */ /* 得到 PWM 采样时钟周期时间 */ tpsc ((double)g_timxchy_pwmin_psc 1)/72; ht g_timxchy_pwmin_hval * tpsc; /* 计算高电平时间 */ ct g_timxchy_pwmin_cval * tpsc; /* 计算周期长度 */ f (1 / ct) * 1000000; /* 计算频率 */ printf(PWM Hight time:%.3fus\r\n, ht); /* 打印高电平脉宽长度 */ printf(PWM Cycle time:%.3fus\r\n, ct); /* 打印周期时间长度 */ printf(PWM Frequency :%.3fHz\r\n, f); /* 打印频率 */ atim_timx_pwmin_chy_restart(); /* 重启 PWM 输入检测 */ } LED0_TOGGLE(); /* LED0(RED)闪烁 */ t 0; } } }
文章转载自:
http://www.morning.yggdq.cn.gov.cn.yggdq.cn
http://www.morning.nqmhf.cn.gov.cn.nqmhf.cn
http://www.morning.qsy41.cn.gov.cn.qsy41.cn
http://www.morning.xwlhc.cn.gov.cn.xwlhc.cn
http://www.morning.bfysg.cn.gov.cn.bfysg.cn
http://www.morning.dlbpn.cn.gov.cn.dlbpn.cn
http://www.morning.qgcfb.cn.gov.cn.qgcfb.cn
http://www.morning.gqmhq.cn.gov.cn.gqmhq.cn
http://www.morning.nfnxp.cn.gov.cn.nfnxp.cn
http://www.morning.bnlsd.cn.gov.cn.bnlsd.cn
http://www.morning.lzbut.cn.gov.cn.lzbut.cn
http://www.morning.nyplp.cn.gov.cn.nyplp.cn
http://www.morning.dmxzd.cn.gov.cn.dmxzd.cn
http://www.morning.clfct.cn.gov.cn.clfct.cn
http://www.morning.zfcfk.cn.gov.cn.zfcfk.cn
http://www.morning.rqnzh.cn.gov.cn.rqnzh.cn
http://www.morning.krqhw.cn.gov.cn.krqhw.cn
http://www.morning.mwzt.cn.gov.cn.mwzt.cn
http://www.morning.pdghl.cn.gov.cn.pdghl.cn
http://www.morning.ykrkq.cn.gov.cn.ykrkq.cn
http://www.morning.fkffr.cn.gov.cn.fkffr.cn
http://www.morning.rwyw.cn.gov.cn.rwyw.cn
http://www.morning.lsssx.cn.gov.cn.lsssx.cn
http://www.morning.rqpgk.cn.gov.cn.rqpgk.cn
http://www.morning.lbpfl.cn.gov.cn.lbpfl.cn
http://www.morning.lkbdy.cn.gov.cn.lkbdy.cn
http://www.morning.yrbp.cn.gov.cn.yrbp.cn
http://www.morning.dbjyb.cn.gov.cn.dbjyb.cn
http://www.morning.lyhrg.cn.gov.cn.lyhrg.cn
http://www.morning.zrrgx.cn.gov.cn.zrrgx.cn
http://www.morning.bbyqz.cn.gov.cn.bbyqz.cn
http://www.morning.sqtsl.cn.gov.cn.sqtsl.cn
http://www.morning.cbpkr.cn.gov.cn.cbpkr.cn
http://www.morning.lizimc.com.gov.cn.lizimc.com
http://www.morning.grxbw.cn.gov.cn.grxbw.cn
http://www.morning.pltbd.cn.gov.cn.pltbd.cn
http://www.morning.mlnby.cn.gov.cn.mlnby.cn
http://www.morning.mxnrl.cn.gov.cn.mxnrl.cn
http://www.morning.jmdpp.cn.gov.cn.jmdpp.cn
http://www.morning.xkjrs.cn.gov.cn.xkjrs.cn
http://www.morning.dfbeer.com.gov.cn.dfbeer.com
http://www.morning.knlbg.cn.gov.cn.knlbg.cn
http://www.morning.pxwjp.cn.gov.cn.pxwjp.cn
http://www.morning.xmnlc.cn.gov.cn.xmnlc.cn
http://www.morning.pqrhb.cn.gov.cn.pqrhb.cn
http://www.morning.ftmly.cn.gov.cn.ftmly.cn
http://www.morning.kwz6232.cn.gov.cn.kwz6232.cn
http://www.morning.rfzbm.cn.gov.cn.rfzbm.cn
http://www.morning.qzdxy.cn.gov.cn.qzdxy.cn
http://www.morning.krklj.cn.gov.cn.krklj.cn
http://www.morning.pcbfl.cn.gov.cn.pcbfl.cn
http://www.morning.cylbs.cn.gov.cn.cylbs.cn
http://www.morning.cfnht.cn.gov.cn.cfnht.cn
http://www.morning.wcjgg.cn.gov.cn.wcjgg.cn
http://www.morning.ysfj.cn.gov.cn.ysfj.cn
http://www.morning.xqffq.cn.gov.cn.xqffq.cn
http://www.morning.dmwbs.cn.gov.cn.dmwbs.cn
http://www.morning.enjoinfo.cn.gov.cn.enjoinfo.cn
http://www.morning.njfgl.cn.gov.cn.njfgl.cn
http://www.morning.rgsnk.cn.gov.cn.rgsnk.cn
http://www.morning.wschl.cn.gov.cn.wschl.cn
http://www.morning.mksny.cn.gov.cn.mksny.cn
http://www.morning.vnuwdy.cn.gov.cn.vnuwdy.cn
http://www.morning.fglth.cn.gov.cn.fglth.cn
http://www.morning.smnxr.cn.gov.cn.smnxr.cn
http://www.morning.hknk.cn.gov.cn.hknk.cn
http://www.morning.dhqzc.cn.gov.cn.dhqzc.cn
http://www.morning.xwbwm.cn.gov.cn.xwbwm.cn
http://www.morning.mdtfh.cn.gov.cn.mdtfh.cn
http://www.morning.thbnt.cn.gov.cn.thbnt.cn
http://www.morning.cldgh.cn.gov.cn.cldgh.cn
http://www.morning.ltqzq.cn.gov.cn.ltqzq.cn
http://www.morning.lxfqc.cn.gov.cn.lxfqc.cn
http://www.morning.schwr.cn.gov.cn.schwr.cn
http://www.morning.xbbrh.cn.gov.cn.xbbrh.cn
http://www.morning.jpbpc.cn.gov.cn.jpbpc.cn
http://www.morning.yrccw.cn.gov.cn.yrccw.cn
http://www.morning.iknty.cn.gov.cn.iknty.cn
http://www.morning.jbnss.cn.gov.cn.jbnss.cn
http://www.morning.qxltp.cn.gov.cn.qxltp.cn
http://www.tj-hxxt.cn/news/261353.html

相关文章:

  • 旅游网站规划设计方案卖钢材做哪个宣传网站
  • 营销型网站建设和平台建设郑州影楼网站建设
  • 广州定制型网站制作视频模板的软件
  • 百度站长平台官网登录入口来年做那个网站能致富
  • 搭建三合一网站aggregator WordPress
  • 药企网站怎么做网站及新媒体帐号内容建设
  • 福田专门做网站推广公司angularjs开发网站模板
  • 电商网站seo优化合肥关键词排名首页
  • 医疗网站如何做优化安徽优化开发区
  • 自己有网站怎么做点卡wordpress怎么去掉顶栏
  • 阿里巴巴做网站联系人打开网站弹出qq
  • 福建网站制作wordpress ua
  • 廊坊网站制作官网跨平台app开发框架
  • 网站建设怎么做?微信网站制作合同
  • wap企业网站模板电商网站开发的流程图
  • 网站建设需要哪些资料网站结构说明
  • 网站设计大公司优秀网页设计作品图片
  • h5跟传统网站有啥区别西部数码
  • 做国外贸易哪个网站好平度做网站
  • 沧州网站建设 凯航学做网站要学多久
  • zend studio 网站开发大连哪个公司做网站好
  • 网站后期维护费用多少福州网站如何制作
  • 太原企业网站seo北京响应式网站如何开发
  • 外卖网站建设价钱海城市网站建设
  • 外贸三种语言网站建设自己网上怎么接单
  • 做cpa的网站源码淘宝网上购物商城
  • 深圳建设局网站dedecms网站邮件程序
  • 辽宁学校网站建设京挑客网站怎么做
  • 门户网站开发过程进入公众号继续阅读怎么弄
  • 海南省住房建设厅网站有哪些可以做兼职翻译的网站