会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 高档定时器PWM输入形式的装备办法!

高档定时器PWM输入形式的装备办法

时间:2025-05-24 18:58:54 来源:锐评时讯 作者:咨询 阅读:961次

MCU。微讲堂。

CKS32F107xx。 TI。M(三)。

第四十八期 2024.11.08。

PWM输入捕获。

上节课咱们介绍了高档。定时器。互补PWM输出的装备办法,这节课咱们将向咱们介绍高档定时器的另一个常见运用——PWM输入形式。在本节课中,咱们将先环绕输入捕获形式翻开,并关键描绘PWM输入形式和触及的。寄存器。,终究经过一个试验例程去介绍PWM输入形式的装备办法。

输入捕获形式简介。

1、一般输入形式。

除根本定时器外,其他定时器的部分通道都能够对输入。信号。的上升沿、下降沿或许双边缘进行捕获,并且计数器CNT的值会被锁存到捕获/比较寄存器CCR中。当咱们需求一起捕获PWM波的频率和占空比时,仅需求测出一个周期中高电平缓低电平继续的时刻即可。咱们可测验如下过程:首要将定时器的某一通道初始设置为上升沿捕获,当发生第一次捕获到上升沿的中止,以此中止时刻作为一个起点,读取CCR中值为Value1,此刻将捕获形式设置为下降沿捕获,在发生第2次中止的时分,捕获到了下降沿,读取CCR中值为Value2,那么Value2和Value1之间的差值,便是一个周期中高电平继续的时刻,然后咱们在中止中又将捕获的方法设置为上升沿捕获,那么在第三次发生中止的时分,读取CCR中值为Value3,那么Value3和Value2之间的差值便是一个周期中低电平的时刻。至此,PWM波的频率可由Value3和Value1之间的差值核算出,正占空比则可经过高电平占整个周期的比值取得。如下图1所示:

图1 一般输入捕获概览图。

2、PWM输入形式。

PWM输入形式是一般输入形式的一种特例,以输入通道TI1为例,PWM信号进入该通道后,信号被分红TI1FP1和TI1FP2两路,终究别离映射到了。IC。1和IC2捕获通道,其间一个捕获上升沿,另一个捕获下降沿。这样用户能够在中止中去读上升沿和下降沿对应寄存器中的计数,然后得出周期和占空比。并且用户在规划之初,需求先选定哪一路为触发信号以及触发极性,一旦选定某一路为触发信号则对应的即为周期,另一路则对应为占空比,两路捕获极性也是相反的,并且因为是PWM输入捕获的原因,当其间一路装备完结,另一路由。硬件。主动装备,无需软件来装备。图2为PWM输入形式时序图。

图2 PWM输入形式时序图。

其间,IC1捕获通道核算两次都是上升沿的时刻,即周期T;而IC2通道则核算一次下降沿和之前上升沿之差,这样得到高电平时长,然后能够求得周期T和占空比。需求留意的是,PWM输入形式需求占用两个捕获寄存器,且只要TI1FP1和TI2FP2衔接到了从形式。操控器。(运用PWM输入捕获时,需求装备从形式操控器为复位形式),所以只能运用定时器的通道1或通道2。

寄存器和输入捕获结构体概述。

1、捕获/比较寄存器CCMR。

关于CCMR寄存器,上节课咱们介绍了输出比较形式,这节课咱们来介绍下输入捕获形式,该寄存器的各位描绘图如下:

图3 CCMR1寄存器各位描绘图。

该16位寄存器CCMR的基层对应输入捕获(上层对应输出比较),其间CCMR1用于捕获通道1和2的操控,CCMR2用于捕获通道3和4的操控。下图为低8位详细描绘图,用于捕获通道1。

图4 CCMR1寄存器低7位描绘图。

参数。CC1S,用于输入捕获/输出比较通道的引脚挑选,若咱们设置CCIS[1:0] = 01,标明CC1通道(对应定时器的通道1)被装备为输入,IC1映射在TI1上。

参数IC1PSC,装备为00时,标明每1个边缘触发1次捕获。

参数IC1F,用来设置TI1输入采样频率和数字。滤波器。长度,本课中咱们不做滤波处理。

2、捕获/比较使能寄存器CCER。

在本课中咱们仅用到低2位CC1E和CC1P,因为咱们需求在中止中处理捕获的数据,所以装备CC1E为1,CC1P装备为不反相,故设置为0。CCER低2位图如下描绘。

图5 CCMR1寄存器低7位描绘图。

3、输入捕获结构体TIM_ICInitTypeDef。

可合作TIM_PWMIConfig函数完结定时器输入通道各参数的初始化装备。输入捕获结构体的各参数界说如下:

typedef struct。

{。

uint16_t TIM_Channel;
uint16_t TIM_ICPolarity;
uint16_t TIM_ICSelection;
uint16_t TIM_ICPrescaler;
uint16_t TIM_ICFil。te。r;

} TIM_ICInitTypeDef;

1)参数TIM_Channel:设定CCMRx寄存器CCxS位,用于捕获通道ICx挑选。

2)参数TIM_ICPolarity:设定CCER寄存器CCxP位和CCxNP位,用于输入捕获边缘触发挑选。

3)参数TIM_ICSelection:设定CCRMx寄存器的CCxS[1:0]位,用于输入通道挑选,输入通道共有三个来历,别离为:TIM_ICSelection_DirectTI、TIM_ICSelection_IndirectTI或TIM_ICSelection_TRC。若为一般输入形式,4个通道均能运用;若为PWM输入形式,只能运用通道1和2。输入通道和捕获通道的映射联系详见下图。

图6 输入通道和捕获通道的映射联系。

4)参数TIM_ ICPrescaler:设定CCMRx寄存器的ICxPSC[1:0]位的值,用来设置输入捕获分频系数,有1、2、4、8分频可选。这儿咱们需求捕获输入信号的每个有用边缘,故设置为1分频即可。

5)参数TIM_ ICFilter:设定CCMRx寄存器ICxF[3:0]位,用于设置输入捕获滤波器。

本课中咱们装备的示例代码如下:

TIM_ICInitTypeDef TIM_ICInitStructure;

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;

TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;

TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;

TIM_ICInitStructure.TIM_ICFilter = 0x0;

TIM_PWMIConfig(TIM1, &TIM_ICInitStructure);

上述代码中,咱们设置定时器的通道1为上升沿捕获,且输入通道1(TI1)与捕获通道1(IC1)为直接映射,不分频,不运用滤波器。

PWM形式输入装备试验。

本试验装备高档定时器的通道1,即PA8,用于捕获信号发生器输出PWM信号,终究经过串口调试帮手打印捕获到的PWM的频率和占空比。首要的。编程。关键如下。

1、高档定时器引脚初始化。

因为TIM1_CH1是衔接在PA8上,这儿需求敞开GPIOA。时钟。,并装备引脚为浮空输入,咱们装备的代码如下:

void TIM1_GPIO_Configuration(void)。

{。

GPIO_InitTypeDefGPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_。Pi。n = GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

}。

2、高档定时器中止优先级设置。

之前的课程中让咱们对中止优先级已经有了深化了解,这儿因为咱们只要一个捕获/比较中止源,所以优先级随意设置,咱们装备的代码如下:

void TIM1_NVIC_Configuration(void)。

{。

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannel。Sub。Priority = 3;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}。

3、高档定时器PWM输入形式装备。

咱们首要对时基和输入捕获结构体初始化,装备代码如下:

void TIM1_Input_Capture_Mode_Configuration(void)。

{。

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_ICInitTypeDef TIM_ICInitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

/* Time Base Configuration */。

TIM_TimeBaseStructure.TIM_Period = 65535-1;

TIM_TimeBaseStructure.TIM_Prescaler = 72-1;

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseStructure.TIM_RepetitionCounter=0;

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

/* PWM Input Capture Configuration */。

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;

TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;

TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;

TIM_ICInitStructure.TIM_ICFilter = 0x0;

TIM_PWMIConfig(TIM1, &TIM_ICInitStructure);

TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);

TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);

TIM_SelectMaste。rS。laveMode(TIM1,TIM_MasterSlaveMode_Enable);

TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);

TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);

TIM_Cmd(TIM1, ENABLE);

}。

从上述示例代码来看,咱们首要将TIM1_CH1的捕获计数器设置为1us计数一次,重装载值为65535,所以能够捕获的时刻精度为1us,最低可捕获的频率为15.3Hz。其次,咱们挑选TIM1的通道1(TI1)作为PWM信号输入,并挑选TI1FP1为触发信号(输入的信号被分为TI1FP1和TI1FP2),因而IC1捕获PWM信号周期,IC2捕获PWM信号占空比。并且因为PWM输入形式下,当捕获开始时,需求将CNT复位,所以咱们需求装备定时器以从形式作业在复位形式下,终究使能捕获中止和高档定时器。

4、高档定时器中止服务函数装备。

在函数TIM1_CC_IRQHandler中,如果是第一个上升沿中止,计数器CNT会被复位,锁存到CCR1寄存器的值是0,CCR2寄存器的值也是0,无法核算频率和占空比。当第2次上升沿到来的时分,CCR1和CCR2捕获到的才是有用的值。其间CCR1对应的是周期,CCR2对应的是占空比。咱们装备的代码如下:

void TIM1_CC_IRQHandler(void)。

{。

TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);

IC1Value = TIM_GetCapture1(TIM1);

IC2Value = TIM_GetCapture2(TIM1);

if (IC1Value != 0)。

{。

DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);

Frequency = (72000000/((72-1)+1))/(float)(IC1Value+1);

printf("占空比:%0.2f%% 频率:%0.2fHz ", DutyCycle, Frequency);

}。

else。

{。

DutyCycle = 0;

Frequency = 0;

}。

}。

5、主函数装备。

main函数便是对上述函数的调用,装备示例如下:

int main(void)。

{。

CKS_USART_Init();

printf("CKS Timer Input Capture Demo start running... ");

TIM1_GPIO_Configuration();

TIM1_NVIC_Configuration();

TIM1_Input_Capture_Mode_Configuration();

while(1){}。

}。

至此,咱们装备已完结。

6、。下载。验证。

咱们将编译好的程序下载至CKS32F107xx开发板,信号发生器和PWM输入引脚PA8经过杜邦线衔接,USB。转TTL模块别离与。UART。1—PA9和。电脑。相连,然后翻开串口调试帮手,检查打印。信息。

内容来源:https://bachduy.com/app-1/vòng 16 euro 2021,http://chatbotjud-teste.saude.mg.gov.br/app-1/QkKAoc-20231127

(责任编辑:人文)

    系统发生错误

    系统发生错误

    您可以选择 [ 重试 ] [ 返回 ] 或者 [ 回到首页 ]

    [ 错误信息 ]

    页面发生异常错误,系统设置开启调试模式后,刷新本页查看具体错误!