教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 法律文档 >

stm32 PWM输入捕获(2)

来源:网络收集 时间:2026-09-07
导读: 2. 举例说明:例如TIM时钟频率设置为12MHZ,输出比较寄存器中的自装载值为600(高电平或低电平计数值),则输出的PWM频率为 frequency = 12MHZ/(600*2)=10KHZ。 二、程序设计与分析 1. TIM计数器和输出比较器的配

2. 举例说明:例如TIM时钟频率设置为12MHZ,输出比较寄存器中的自装载值为600(高电平或低电平计数值),则输出的PWM频率为

frequency = 12MHZ/(600*2)=10KHZ。

二、程序设计与分析

1. TIM计数器和输出比较器的配置

uint16_t capture = 0;

extern __IO uint16_t CCR1_Val; extern __IO uint16_t CCR2_Val; extern __IO uint16_t CCR3_Val; extern __IO uint16_t CCR4_Val;

void TIM_Configuration(void) {

/* Time base configuration */

TIM_TimeBaseStructure.TIM_Period = 65535; //这里必须是65535 TIM_TimeBaseStructure.TIM_Prescaler = 2; //3分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化TIM3

/* Output Compare Toggle Mode configuration: Channel1 */

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //输出比较翻转模式 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能通道1 TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //待装入输出比较寄存器中的脉冲值

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出为正逻辑 TIM_OC1Init(TIM3, &TIM_OCInitStructure); //写入配置

TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable); //使能或者失能TIMx在CCR1上的预装载寄存器

/* Output Compare Toggle Mode configuration: Channel2 */

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

TIM_OC2Init(TIM3, &TIM_OCInitStructure);

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);

/* Output Compare Toggle Mode configuration: Channel3 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR3_Val;

TIM_OC3Init(TIM3, &TIM_OCInitStructure);

TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);

/* Output Compare Toggle Mode configuration: Channel4 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR4_Val;

TIM_OC4Init(TIM3, &TIM_OCInitStructure);

TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);

/* TIM enable counter */

TIM_Cmd(TIM3, ENABLE); //开启计数器

/* TIM IT enable */ //TIM1中断源设置,开启相应通道的捕捉比较中断 TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE); }

2. 时钟配置

3. GPIO配置

4. 中断服务程序

void TIM3_IRQHandler(void) {

/* TIM3_CH1 toggling with frequency = 183.1 Hz */

if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET) 与否 {

TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );

capture = TIM_GetCapture1(TIM3); 的计数值

TIM_SetCompare1(TIM3, capture + CCR1_Val ); 输出比较寄存器中,以保证下一个TIM事

冲数 }

/* TIM3_CH2 toggling with frequency = 366.2 Hz */ if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET) {

TIM_ClearITPendingBit(TIM3, TIM_IT_CC2); capture = TIM_GetCapture2(TIM3);

TIM_SetCompare2(TIM3, capture + CCR2_Val); }

/* TIM3_CH3 toggling with frequency = 732.4 Hz */

//检查指定的TIM中断发生 //清除TIMx的中断待处理位 //获得输入捕获值,即计数器中将计数值加上翻转的脉冲值写入 //件也是相同的脉 // if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET) {

TIM_ClearITPendingBit(TIM3, TIM_IT_CC3); capture = TIM_GetCapture3(TIM3);

TIM_SetCompare3(TIM3, capture + CCR3_Val); }

/* TIM3_CH4 toggling with frequency = 1464.8 Hz */ if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET) {

TIM_ClearITPendingBit(TIM3, TIM_IT_CC4); capture = TIM_GetCapture4(TIM3);

TIM_SetCompare4(TIM3, capture + CCR4_Val); } }

//=================================================================================================================

TIM_OCMode_Timing是在比较成功后不在对应输出管脚上产生输出。

TIM_OCMode_Toggle是在比较成功后翻转对应输出管脚上的电平。

TIM_OCMode_Timing是在比较成功后不在对应输出管脚上产生输出,但是产生中断啊,

//=================================================================================

试STM32的定时器好几天了,也算是对STM32的定时器有了点清楚的认识了。我需要测量4路信号的频率然后通过DMA将信号的频率传输到存储器区域,手册说的很明白每个定时器有4个独立通道。然后我就想能不能将这4路信号都连接到一个定时器的4个通道上去。理论上应该是行的通的。刚开始俺使用的是TIM2的1 2 3通道,TIM4的2通道来进行频率的测量。由于没有频率发生器,所以我用tim3作为信号源,用TIM2,TIM4来进行测量就ok了。 请看一开始的程序,以TIM2的1,3通道为例子:

TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; //配置为输入捕获模式

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择通道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_ICInit(TIM2, &TIM_ICInitStructure);

TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; //配置为输入捕获模式

TIM_ICInitStructure.TIM_Channel = TIM_Channel_3; //选择通道3 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上升沿捕获 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //

TIM_ICInitStructure …… 此处隐藏:2948字,全部文档内容请下载后查看。喜欢就下载吧 ……

stm32 PWM输入捕获(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/436323.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)