网站建设优化多少钱,购物网站建设基本流程,网站建设面谈话术,广西seo公司目录
一、工程背景
二、建立工程
1、配置GPIO
2、选择时钟源和Debug
3、 配置定时器TIM1
4、 配置定时器TIM13
5、配置串口
6、配置中断
7、配置系统时钟
三、代码修改
1、使能TIM1输入捕捉功能和TIM3的PWM输出功能
2、自定义变量
3、重定义回调函数
4、输出到…目录
一、工程背景
二、建立工程
1、配置GPIO
2、选择时钟源和Debug
3、 配置定时器TIM1
4、 配置定时器TIM13
5、配置串口
6、配置中断
7、配置系统时钟
三、代码修改
1、使能TIM1输入捕捉功能和TIM3的PWM输出功能
2、自定义变量
3、重定义回调函数
4、输出到串口
四、查看结果
五、测量脉冲宽度 一、工程背景 文章依赖的硬件及工程配置参考本文作者的其他文章细说ARM MCU的串口接收数据的实现过程-CSDN博客 https://wenchm.blog.csdn.net/article/details/139541112 定时器的输入捕捉功能可以用于计算两个脉冲边沿之间的时间差值。这通常是通过输入捕捉中断来实现的。在第一个脉冲边沿时产生一次中断记录当前计数器的计数值在随后一个边沿时刻也记录一下计数值这两个记录值的差值换算成时间间隔就是两次脉冲边否之间所经过的时间。在信号为周期性脉冲的情况下如果两个边沿类型是一致的譬如均为上升沿或下降沿则记录的时间就是脉冲信号的周期时间如果两个边沿的类型不同如分别为上升沿和下降沿则记录的就是脉冲的宽度。 本例中使用TIM1的定时器的输入捕捉功能同样涉及通道问题这一点与PWM输出功能类似。TIM1有四个通道本例使用通道2(TIM1_CH2)作为输入捕捉通道。TIM1_CH2可以映射到PA9/PC1引脚本例中使用PC1引脚在NUCLEO-G474RE板上该引脚经由CN7端子的第36引脚引出。 使用TM3_CH1作为本里的信号源输出使用PB4引脚。 此外为了显示记录的时间值使用串口模块USART2通过串口将计算的时间值发送到串口通讯助手上。
二、建立工程
1、配置GPIO 配置PC1为TIM1_CH2的信号输入引脚。配置PB4为TIM3_CH1的信号输出引脚。TIM3_CH1输出的信号输入给TIM1_CH2。PC1和PB4的其它参数选作Pull_upHigh。
2、选择时钟源和Debug 高速外部时钟(HSE)选择Crystal/Ce-amic Resonator使用片外时钟晶体作为HSE的时钟源。最后在SYS中将Debug设置为Serial Wire。
3、 配置定时器TIM1 时钟源(Clock Source)选择Internal Clock通道2(Channel 2)的参数选择Input Capture direct mode预分频因子(Prescaler)和计数器周期(Counter Period)分别设置为16999和65535计数模式(Counter Mode)设置为升模式(Up)并且使能自动重载(auto-reload preload)。 计数器的预分频因子决定着计数器两次计数之间的时间间隔时钟频率为170 MHz预分频因子为16999则两次计数169991/170×106100(us)。由于两次计数的时间间隔是100 μs所以当计数周期为65535时能记录的最长时间为(655351)×100 μs约6.55 s。 其它参数配置边沿极性选择上升沿(Rising Edge)捕捉选择(IC Selection)选择Direct预分频比率(Prescaler Division Ratio)选择不分频(Nodivision)。预分频比率这个参数可以设置多次事件触发一次捕捉选择No division意思就是来一个边沿就触发一次捕捉。最后一个参数为输入滤波器(Input Filter)这个参数是为了抗干扰用的在这个例子中暂不使用设置为0。
4、 配置定时器TIM13 将时钟源设置为Internal Clock选择PWM Generation CH1。然后将预分频因(Prescaler)和计数器周期(Counter Period)分别设置为999和8499(这两个参数从0开始计数)计数模式(Counter Mode)设置为升模式(Up)并使能自动重载(auto-reload preload)。 预分频因子决定着两次计数之间的时间间隔这里设置的1000(9991)是将时钟脉冲分频1000倍。假如时钟频率为170 MHz则分频1000倍后就是170 kHz。 将计数周期设置为8499也就是计数到8499后重新从0开始计。在计数频率170 kHz之下计数器的周期为(1/170×10³)×8500≈50(ms)对应的频率为20 Hz。在PWM Generation Channel 1的参数配置中选择PWM mode 1脉冲数(Pulse)设置为4250(该参数从1开始)通道极性设置为High。通道极性参数用于指定在Pulse个计数期间输出的是高电平还是低电平。这里脉冲数Pulse决定着占空比这里设为4250是计数器周期的1/2所以占空比刚好为50%。
5、配置串口 在USART2的模式(Mode)区中选择Asynchronous在下面的配置(Configuration)区中展开的参数设置(Parameter Settings)选项卡保持默认值即可(波特率为115200)数据位8停止位1奇偶校验无设置USART2的两个引脚PA2和PA3的参数。由于本例中只是通过串口发送数据无需使用串口的中断功能所以不用设置串口中断。其它参数选择Pull_upHigh。
6、配置中断 TIM1 capture compare interrupt出现在中断表中并且已使能将它的抢占式优先级设为1响应优先级设为0。 TIM3 global interrupt出现在中断表中将其使能将它的抢占式优先级设为1响应优先级设为0。
7、配置系统时钟 将系统时钟(SYSCLK)频率配置为170 MHz。
三、代码修改 配置完成后保存并启动代码自动生成。
1、使能TIM1输入捕捉功能和TIM3的PWM输出功能 在主程序初始化时开启TIM1通道2的输入捕捉中断。开启该中断可以通过调用函数HAL_TIM_IC_Start_IT()来实现。 还要使能TIM3通道1的PWM输出。使用库函数HAL_TIM_PWM_Start()。 把它们放到main函数中while(1)之前、TIM1初始化函数MX_TIM1_Init()之后的注释对中
/* USER CODE BEGIN 2 */
HAL_TIM_IC_Start_IT(htim1,TIM_CHANNEL_2);
HAL_TIM_Base_Start_IT(htim3);
HAL_TIM_PWM_Start(htim3,TIM_CHANNEL_1);
/* USER CODE END 2 */
2、自定义变量 由于要记录两次发生捕捉中断时刻计数器的值所以需要定义四个变量存放两次计数值及它们之间的差值的变量以及一个计数标志用的变量。将这些变量定义为全局变量放置到main.c中的一个注释对中。对这些变量的定义如下
/* USER CODE BEGIN PV */
uint16_t ICValue1 0; //存放第一个计数??
uint16_t ICValue2 0; //存放第二个计数??
uint16_t DiffICValue 0; //存放两个计数值之?
uint8_t CaptureIndex 0; //计数标志
/* USER CODE END PV */
3、重定义回调函数
定时器输入捕捉中断的回调函数如下
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) 这个函数在stm32g4xx_hal_tim.c中是以弱函数的形式被定义的实际是一个空函数所以要在main.c中重新定义它。 下面给出回调函数的具体实现
/* USER CODE BEGIN 4 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim-Channel HAL_TIM_ACTIVE_CHANNEL_2){if(CaptureIndex 0){/*记录第一个计数值 */ICValue1 HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);CaptureIndex 1;}else if(CaptureIndex 1){/*记录第二个计数值 */ICValue2 HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);/*计算两次计数值之值 */if(ICValue2 ICValue1)DiffICValue (ICValue2 - ICValue1);else if(ICValue2 ICValue1)DiffICValue ((0xFFFF -ICValue1) ICValue2) 1;printf(Time %d ms\r\n,DiffICValue/10);CaptureIndex 0;}}
}int __io_putchar(int ch)
{HAL_UART_Transmit(huart2,(uint8_t *)ch,1,0xFFFF);return ch;
}
/* USER CODE END 4 */ 用了一条用于串口发送的printf语句
printf(Time %d ms\r\n,DiffICValue/10); DiffICValue是两次计数值之差为50ms。
4、输出到串口 由于用到了printf函数所以需要添加相关代码。对main.c做如下几处修改 首先将stdio.h包含进来。可以将它放到main.c前面的一个注释对中 其次给出putchar函数的定义。可以将它与回调函数HAL_TIM_IC_CaptureCallback放到同一注释对中
int __io_putchar(int ch)
{HAL_UART_Transmit(huart2,(uint8_t *)ch,1,0xFFFF);return ch;
}
四、查看结果 把开发板上的PB4和PC1用杜邦线连接起来PB4是信号源PC1开始边沿捕捉。 图为示波器检测到的PB4信号 频率20Hz、周期50ms占空比50%。 串口助手收到的信号周期数值相邻两个上升沿的数值差。 五、测量脉冲宽度 如果要测量脉冲宽度或者观察占空比的变化可以在输入捕捉通道(Input Capute Chan-
nel 2)的参数配置中将边沿极性选择(Polarity Selection)参数修改为上升/下降沿(Both Edges)。保存文件、重新生成代码。编译下载并运行。 此时串口接收到的数据就是脉冲宽度了。