17网站一起做网店好不好,泰安招聘齐鲁人才网,wordpress 所有标签,洛阳房产网目录 概述
1 输入捕获模式
1.1 原理介绍
1.2 实现步骤
1.3 发生输入捕获流程
2 使用STM32Cube配置工程
2.1 软件环境 2.2 配置参数
2.3 生成项目文件
3 功能实现
3.1 PWM调制占空比函数
3.2 应用函数库
4 测试
4.1 功能框图
4.2 运行结果 源代码下载地址#xf…目录 概述
1 输入捕获模式
1.1 原理介绍
1.2 实现步骤
1.3 发生输入捕获流程
2 使用STM32Cube配置工程
2.1 软件环境 2.2 配置参数
2.3 生成项目文件
3 功能实现
3.1 PWM调制占空比函数
3.2 应用函数库
4 测试
4.1 功能框图
4.2 运行结果 源代码下载地址
stm32-f103-rct6-输入捕获测试代码资源-CSDN文库
概述
本文主要介绍STM32高级定时器的用法至输入捕获功能该功能可用于捕捉外部输入信号的频率。笔者通过详细的案例介绍这个功能包括理论知识实现原理以及如何使用STM32Cube配置基本的参数编写实用代码实现捕捉频率当的功能。
1 输入捕获模式
1.1 原理介绍
在输入捕获模式下捕获/比较寄存器TIMx_CCRx用于锁存在由相应的ICx信号检测到的转变之后的计数器的值。当发生捕获相应的CCXIF标志TIMx_SR寄存器被设置并且中断或 如果它们被启用则可以发送DMA请求。如果在CCxIF标志为则过捕获标志CCxOFTIMx_SR寄存器被设置。CCxIF可以是软件通过将其写入“0”或读取存储在中的捕获数据来清除TIMx_CCRx寄存器。CCxOF在写入“0”时被清除。
1.2 实现步骤
以下示例显示如何在TI1时捕获TIMx_CCR1中的计数器值投入增加。要执行此操作请使用以下步骤 1 选择激活输入TIMx_CCR1必须连接到TI1输入因此写入CC1S位到TIMx_ CCMR1寄存器中的01。一旦CC1S变得与00不同通道被配置在输入端并且TIMx_ CCR1寄存器变为只读。 2 针对连接到的信号编程所需的输入滤波器持续时间定时器如果输入是TIx输入则通过在TIMx_CCMRx寄存器中编程ICxF位。让我们想象一下当切换时输入信号在at must five期间不稳定内部时钟周期。我们必须编程一个比这五个时钟更长的滤波器持续时间循环。当8个连续样本具有新的已经检测到电平以fDTS频率采样。然后将IC1F位写入中的0011 CCMR1寄存器。 3 通过将CC1P位写入0选择TI1通道上活动转换的边缘CCER寄存器在这种情况下为上升沿。 4 对输入预分频器进行编程。在我们的示例中我们希望捕获在每个有效转换因此预分频器被禁用将IC1PS位写入TIMx_CCMR1寄存器 5 通过在中设置CC1E位启用从计数器到捕获寄存器的捕获TIMx_CCER寄存器。 6 如果需要通过在中设置CC1IE位来启用相关的中断请求TIMx_DIER寄存器和/或DMA请求通过在TIMx_DIER寄存器。 1.3 发生输入捕获流程
为了处理过度捕获建议在过度捕获标志。这是为了避免错过阅读后可能发生的过度捕获 标志和读取数据之前。 1 TIMx_CCR1寄存器在激活转换时获取计数器的值。 2CC1IF标志被设置中断标志。如果至少有两次连续捕获也会设置CC1OF发生而标志未被清除。 3根据CC1IE位生成中断 4根据CC1DE位生成DMA请求 注意问题
IC中断和/或DMA请求可以由软件通过设置EGR寄存器中相应的CCxG位。
2 使用STM32Cube配置工程
2.1 软件环境
软件名称版本信息STM32CubeSTM32CubeMX 6.11STM32 HALSTM32Cube_FW_F1_V1.8.5
2.2 配置参数
1配置系统时钟72M Hz,Timer的工作时钟为72M Hz 2) 使用定时器1配置输入捕获功能 其对应的IO口配置 计数器时钟参数和捕获通道参数 3配置PWM相关参数
选择定时器8作为控制PWM的输出 PWM波对应的IO接口 Timer-8定时器相关参数 和PWM相关的参数配置 2.3 生成项目文件 使用STM32FCube完成项目配置后就可以生成工程文件。生成代码如下 3 功能实现
3.1 PWM调制占空比函数
在tim.c中实现一个函数其用于实现调制PWM的占空比。函数原型如下
void HAL_TIM_SetPWM_Pulse( uint32_t Pulse, uint32_t Channel)
{TIM_OC_InitTypeDef sConfigOC {0};sConfigOC.OCMode TIM_OCMODE_PWM1;sConfigOC.Pulse Pulse;sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH;sConfigOC.OCNPolarity TIM_OCNPOLARITY_HIGH;sConfigOC.OCFastMode TIM_OCFAST_DISABLE;sConfigOC.OCIdleState TIM_OCIDLESTATE_RESET;sConfigOC.OCNIdleState TIM_OCNIDLESTATE_RESET;if (HAL_TIM_PWM_ConfigChannel(htim8, sConfigOC, Channel) ! HAL_OK){Error_Handler();}
}
3.2 应用函数库
创建App/product目录实现应用函数。 1pwm_ctrl.c 实现pwm的功能控制 2input_capture.c 实现捕捉功能 1 在 pwm_ctrl.c文件中配置PWM的占空比
void pwm_ctrl_Init( void )
{HAL_TIM_Base_Start( htim8 );HAL_TIM_PWM_Start( htim8, TIM_CHANNEL_1); // PC6 HAL_TIM_PWM_Start( htim8, TIM_CHANNEL_2); // PC7HAL_TIM_SetPWM_Pulse( 500, TIM_CHANNEL_1);HAL_TIM_SetPWM_Pulse( 500, TIM_CHANNEL_2);
}2input_capture.c 实现捕捉功能
初始化捕捉功能参数
static void set_captureMode( uint32_t Channel, uint32_t ICPolarity )
{TIM_IC_InitTypeDef sConfigIC {0};if(HAL_TIM_IC_Stop_IT(htim1, Channel) ! HAL_OK){/* Starting Error */Error_Handler();}sConfigIC.ICPolarity ICPolarity;sConfigIC.ICSelection TIM_ICSELECTION_DIRECTTI;sConfigIC.ICPrescaler TIM_ICPSC_DIV1;sConfigIC.ICFilter 0;if (HAL_TIM_IC_ConfigChannel(htim1, sConfigIC, Channel) ! HAL_OK){Error_Handler();}if(HAL_TIM_IC_Start_IT(htim1, Channel) ! HAL_OK) {/* Starting Error */Error_Handler();}
}
3捕捉功能回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{uint32_t uwIC2Value0;static uint32_t uwIC2Value2_list[2];static uint8_t count 0;if(htim-Instance TIM1) {if (htim-Channel HAL_TIM_ACTIVE_CHANNEL_1){/* Get the 1st Input Capture value */uwIC2Value0 HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);uwIC2Value2_list[count] uwIC2Value0;count;if( count 2 ){count 0;if( uwIC2Value2_list[1] uwIC2Value2_list[0])printf( cycle %d us\r\n, uwIC2Value2_list[1]- uwIC2Value2_list[0]);}}}
}
4 测试 4.1 功能框图 4.2 运行结果
1使用逻辑分析仪测试PWM的周期为10ms 2使用捕捉功能测试的数据为 10000us 10ms