file-type

STM32 HAL库PWM输入捕获及计数中断处理教程

下载需积分: 13 | 12.08MB | 更新于2024-10-29 | 174 浏览量 | 0 下载量 举报 1 收藏
download 立即下载
在嵌入式系统开发领域,STM32F103系列微控制器因其高性能、灵活性和丰富的集成外设而广泛应用于各种工业和消费电子产品中。HAL库(硬件抽象层库)是ST公司提供的一套编程框架,旨在简化和标准化对硬件资源的访问。本资源主要关注在STM32F103上使用HAL库进行脉冲宽度调制(PWM)输入捕获的编程技术,尤其针对那些电平时间较长且可能发生多次计数溢出的情况。本资源将详细介绍如何在程序中实现脉冲的关闭和重启,以及如何处理低电平结束时的中断和按键触发的重新计数。 1. STM32F103 HAL库概述: STM32F103系列微控制器基于ARM Cortex-M3内核,其HAL库提供了一种高级的编程接口,允许开发者不必直接操作寄存器,就可以控制微控制器的所有功能。HAL库包括一系列标准函数,用于初始化和操作各种外设(如定时器、ADC、UART等),并提供了底层驱动和外设的硬件抽象,使得应用开发更加简单快捷。 2. PWM输入捕获技术: PWM输入捕获是指使用微控制器的定时器来测量外部PWM信号的频率和占空比。在STM32F103中,定时器模块具备输入捕获功能,能够通过外部引脚接收PWM信号,并通过配置相关寄存器来记录输入脉冲的上升沿和下降沿时间。 3. 计数中断溢出处理: 在处理较长电平时间的PWM信号时,定时器的计数器可能在一次完整的脉冲周期内达到其最大值并溢出。为了避免数据丢失,开发者必须妥善处理这种溢出情况。在HAL库中,定时器溢出事件可以被配置为触发中断,开发者可以在中断服务程序中更新一个溢出计数器,以便在后续计算中考虑这些溢出次数。 4. 脉冲的关闭和重启: 在某些应用场景中,可能需要在低电平结束时停止PWM捕获,并在适当的时候重新启动。这通常涉及到对定时器状态的控制,包括使能/禁止定时器的计数功能,以及在满足特定条件(如检测到低电平)时设置标志位并触发中断处理逻辑。 5. 按键控制重新计数: 为了实现用户交互,程序可能需要响应外部按键事件来重新开始PWM捕获。这涉及到对外部中断的设置和中断服务程序的编写。通过配置GPIO为中断模式,并在中断服务程序中实现重新启动PWM捕获的逻辑,用户可以通过按键操作来控制计数过程。 6. 实际编程实践: 在编程时,首先需要初始化HAL库,配置时钟系统,然后设置并启用相关的外设。对于PWM输入捕获,需要配置定时器的输入捕获通道,设置捕获模式、边沿检测方式和计数器的预分频值。此外,还需要配置中断优先级,并在中断服务程序中编写逻辑来处理溢出和重新捕获的情况。 在编程过程中,开发者应使用STM32CubeMX工具来辅助配置外设和生成初始化代码。工具提供了可视化界面来配置各种参数,并能自动生成HAL库代码框架,这可以大大简化开发流程。 总结来说,本资源详细介绍了在STM32F103微控制器上使用HAL库进行PWM输入捕获和计数中断溢出处理的编程技术。通过一系列的编程实践和技巧,开发者能够有效地测量和控制外部PWM信号,以及实现灵活的用户交互功能。掌握这些知识对于开发稳定、高效的嵌入式系统至关重要。

相关推荐

filetype

#include<stm32f10x.h> #include"sys.h" extern unsigned char Rec_Dat_U1; extern unsigned char Rec_String_U1[200]; extern int conut_flag_1; #define in_1(x) x?GPIO_ResetBits(GPIOC , GPIO_Pin_0): GPIO_SetBits(GPIOC , GPIO_Pin_0) #define in_2(x) x?GPIO_ResetBits(GPIOC , GPIO_Pin_1): GPIO_SetBits(GPIOC , GPIO_Pin_1) #define in_3(x) x?GPIO_ResetBits(GPIOB , GPIO_Pin_10): GPIO_SetBits(GPIOB , GPIO_Pin_10) #define in_4(x) x?GPIO_ResetBits(GPIOB , GPIO_Pin_11): GPIO_SetBits(GPIOB , GPIO_Pin_11) #define key_1 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12) #define key_2 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13) #define key_3 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14) #define key_4 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15) float Kp_l = 0.82 ; //比例常数 float Ti_l = 0.09 ; //微分时间常数 float Td_l = 0.015 ; //采样周期 float Kp_r = 0.20 ; float Ti_r = 0.09 ; float Td_r = 0.015 ; #define T 0.02 #define Ki_l Kp_l*(T/Ti_l) // Kp Ki Kd #define Kd_l Kp_l*(Td_l/T) #define Ki_r Kp_l*(T/Ti_l) // Kp Ki Kd #define Kd_r Kp_l*(Td_l/T) #define left_b in_1(1); in_2(0); #define left_f in_1(0); in_2(1); #define right_f in_3(1); in_4(0); #define right_b in_1(0); in_2(1); extern float pwm_l; extern float pwm_r; void CAR_GPIO_INIT(void); int main() { // int speed=50; SYS_CONFIG(); CAR_GPIO_INIT(); pwm_init(TIM3_1); pwm_init(TIM3_2); TIM4_PWMINPUT_INIT(0xffff,31); //1M速度采样率 TIM5_PWMINPUT_INIT(0xffff,31); incPIDinit(); PID_set(Kp_l,Ki_l,Kd_l,Kp_r,Ki_r,Kd_r); //void PID_set(float pp_1,float ii_1,float dd_1,float pp_2,float ii_2,float dd_2) right_f left_f // set_pwm_percent(TIM3_1,50) ; // set_pwm_percent(TIM3_2,50) ; PID_setpoint(&PID_l, 160); PID_setpoint(&PID_r, 160); while(1) { printf("%d\r\n",(int)pwm_l); delay_ms(200); } } void CAR_GPIO_INIT() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOD, &GPIO_InitStructure); }