STM32F105RBT6 使用定时器TIM3输出PWM波

这篇具有很好参考价值的文章主要介绍了STM32F105RBT6 使用定时器TIM3输出PWM波。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. TIM3的GPIO口,查阅STM32F105RBT6 数据手册,TIM3的4通道用的是PB1

STM32F105RBT6 使用定时器TIM3输出PWM波

2. 初始化GPIO口和定时器TIM3

2.1 相关函数

RCC_APB1PeriphClockCmd、GPIO_Init、TIM_TimeBaseInit、TIM_OC4Init、TIM_OC4PreloadConfig、NVIC_Init、TIM_ITConfig、TIM_Cmd、

void TIM3_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    TIM_TimeBaseInitTypeDef TIM_InitStruct;
    TIM_OCInitTypeDef TIM_OCInitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;

    // Enable clock for TIM3 and GPIOB
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 | RCC_APB2Periph_GPIOB, ENABLE);

    // Initialize GPIOB to output PWM signal
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    // Initialize TIM3 for PWM generation with interrupt on update
      TIM_InitStruct.TIM_Prescaler = 0; // Set PWM frequency to 72MHz (72 MHz / (0 + 1))
    TIM_InitStruct.TIM_Period = 999;
    TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_InitStruct);

    TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStruct.TIM_Pulse = 500; // Duty cycle = 50%
    TIM_OC4Init(TIM3, &TIM_OCInitStruct);
    TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

    NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 4;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);

    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM3, ENABLE);
}

3. 中断入口 TIM3_IRQHandler

3.1 在启动文件里面找到TIM3 对应的中断入口函数,也就是中断服务函数 TIM3_IRQHandler

STM32F105RBT6 使用定时器TIM3输出PWM波

4. 编写中断服务函数

void TIM3_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET) // overflow interrupt
    {
        printf("龙傲天说,我三岁拳打南山不老院,四岁脚踢北海幼儿园\r\n");
    }
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update); // clear interrupt flag

    // Handle interrupt by updating PWM duty cycle value
//    static uint16_t duty_cycle = 500; // Initial value of 50%
//    duty_cycle = duty_cycle < 950 ? duty_cycle + 50 : 0; // Increase duty cycle by 5% every period
//    TIM_SetCompare4(TIM3, duty_cycle);
}

4.1 中断服务函数需要快速地执行完毕。中断服务函数应该避免执行太多的计算复杂度较高的操作,否则可能会导致中断响应时间过长,甚至因为延迟而导致系统不稳定。

4.2 如果你需要在中断服务函数中访问全局变量,需要将这些变量定义为volatile类型。这是因为中断服务函数可能会在任何时间被外部中断所打断,如果没有使用volatile类型,就有可能导致变量值不准确。

4.3 在中断服务函数的结尾处,需要调用NVIC_ClearPendingIRQ()函数来清除中断挂起位。

4.4 中断函数最好别用printf 函数等耗时、有可能阻塞的一些函数,printf函数本身就比较耗时,在中断服务函数中调用的话,可能会导致中断响应时间过长,使系统不稳定。如果在中断服务函数中使用了printf函数,可能会导致printf函数与被打断的低优先级代码发生冲突,造成数据异常。我这里用 printf 只是为了装13,我龙傲天谁都不服

4.4 中断服务函数需要快速、简洁、有效地处理中断,并且需要小心地处理共享资源和全局变量。

5. 主函数调用一下初始化函数就可以了

int main(void)
{
    TIM3_Init();
    while (1)
    {
    	printf("剑圣来了,快跑");
	}
}

5.1 如果没有成功输出pwm波,可能是初始化时序不对,前面已经操作过该IO口了,我有很多的例程放在一起,搞混了,需要把原来的操作去掉,屏蔽掉,或者调整一下 TIM3_Init() 的位置,如果有很多别的初始化函数,就把TIM3_Init() 放到后面一点试试

STM32F105RBT6 使用定时器TIM3输出PWM波

6. 串口数据

STM32F105RBT6 使用定时器TIM3输出PWM波

7. 拿示波器或者逻分仪去量PB1 引脚,看波形,有毛刺,我没滤波的,可以处理掉

STM32F105RBT6 使用定时器TIM3输出PWM波

STM32F105RBT6 使用定时器TIM3输出PWM波

8. PWM 波频率、周期计算

8.1 频率 F = SYSCLK / ((TIM_Prescaler + 1) / (TIM_Period + 1))

8.2 周期 T = 1 / F

8.3 制造一个频率是1 Hz的PWM 波,周期 1s, 占空比50%,改下面三个参数值就行了

	TIM_InitStruct.TIM_Prescaler = 7199;
   	TIM_InitStruct.TIM_Period = 10000;
    TIM_OCInitStruct.TIM_Pulse = 5000;  // 占空比50% = 5000 / (TIM_Period + 1)

STM32F105RBT6 使用定时器TIM3输出PWM波

9. TIM3的四个通道输出四路PWM,各个通道之间输出的PWM是独立的,频率,占空比可单独设置

void TIM3_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStruct;
   TIM_TimeBaseInitTypeDef TIM_InitStruct;
   TIM_OCInitTypeDef TIM_OCInitStruct;

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);

   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStruct);

   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOC, &GPIO_InitStruct);

   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
   GPIO_Init(GPIOA, &GPIO_InitStruct);
   /*
    * Initialize TIM3 for generation PWM
    * Set PWM frequency to 72kHz (72 MHz / (999 + 1) / (0 + 1)), TIM3_FRQ = SYSCLK / ((TIM_Period + 1) * (TIM_Prescaler + 1))
    * STM32F105RBT6_PB1 - TIM3_Ch4
    */
   TIM_InitStruct.TIM_Prescaler = 7199; // 0, 7199
   TIM_InitStruct.TIM_Period = 9999; // 999, 9999
   TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
   TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM3, &TIM_InitStruct);

   TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
   TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
   TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
   TIM_OCInitStruct.TIM_Pulse = 5000; // 500,5000 Duty cycle = 50%

   TIM_OC1Init(TIM3, &TIM_OCInitStruct);
   TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

   TIM_OC2Init(TIM3, &TIM_OCInitStruct);
   TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

   TIM_Cmd(TIM3, ENABLE);
}

主函数调用,使能每个通道输出

while (1) {
		TIM_SetCompare1(TIM3, 5000);
        TIM_SetCompare2(TIM3, 5000);
        TIM_SetCompare4(TIM3, 5000);
}

STM32F105RBT6 使用定时器TIM3输出PWM波文章来源地址https://www.toymoban.com/news/detail-478375.html

到了这里,关于STM32F105RBT6 使用定时器TIM3输出PWM波的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F1定时器-PWM输出

    STM32 PWM工作过程 ARR寄存器决定PWM周期,CCR寄存器决定占空比 通道1为例 的PWM输出电路图 CCR1:捕获比较(值)寄存器(x =1,2,3,4):设置比较值。 CCMR1:OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1【110】 或者PWM模式2【111】 CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平

    2024年02月09日
    浏览(81)
  • STM32f103入门(5)定时器中断

    STM32 TIM(定时器/计数器)模块的中断流程如下: 配置TIM寄存器:首先,通过配置TIM相关的寄存器来设置计时器的基本参数,例如预分频系数、计数模式、计数器周期等。 使能TIM中断:使用TIM_ITConfig函数或者直接操作TIM的相关寄存器,将所需的中断使能位置1。可以选择使能不

    2024年02月11日
    浏览(38)
  • STM32F4基础:时钟系统、中断及定时器

            时钟系统是CPU的脉搏, 由于STM32 本身非常复杂,外设非常的多,并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及 RTC 只需要几十 k 的时钟即可,因此STM32F4 的时钟系统比较复杂 ,不像简单的 51 单片机一个系统时钟就可以解决一切。         如下图所

    2023年04月09日
    浏览(41)
  • STM32F系列项目定时器配置-中断触发源详解

    1.以高级定时器为例:  2.触发源选择与极性选择:   3.触发源介绍 (282条消息) 【STM32技巧】(1)STM32定时器8种触发源之ITR0~ITR3说明_stm32 定时器触发定时器_小石头有大内涵的博客-CSDN博客 ITR0 内部触发0 ITR1 内部触发1 ITR2 内部触发2 ITR3 内部触发3 ITR3  

    2024年02月11日
    浏览(52)
  • STM32F407 ADC+DMA+定时器 定时采样模拟量

    项目中需要对多个通道的电压进行一定频率的AD采样,由于采样过程贯穿整个任务,为了使采样过程尽可能不占用CPU资源,采用定时器触发的多通道ADC扫描采样,且采样数据由DMA传到RAM中的缓存。 这样做有以下几个好处:1、由定时器触发ADC采样,这样采样的频率可控,且定时

    2024年02月14日
    浏览(50)
  • STM32F407高级定时器-死区时间研究-STM32CubeMX

    距离上次写笔记,已经过去好长时间了 中间也折腾过不少东西,但是都没咋整理,主要是这中间都是在干活儿,不是自己想要研究的,也没想着要写。 从去年10月份开始想要学习FOC,10月份研究了一个月,到11月初,实现了SVPWM驱动BLDC电机,使用串口实现开环下转速和力矩调

    2023年04月23日
    浏览(54)
  • STM32F103学习笔记(5.1)——定时器时钟

    STM32F103RCT6上总共有8个定时器,其中TIM1和TIM8是高级定时器,它们挂载在APB2高速总线上。而TIM2、TIM3、TIM4、TIM5是通用定时器,TIM6、TIM7是基本定时器,它们都挂载在APB1上,基本定时器的功能最少,高级定时器功能最多。所以以学习通用定时器为主。 需要参考手册第二章存储器

    2024年02月15日
    浏览(42)
  • 【单片机】STM32单片机的各个定时器的定时中断程序,标准库,STM32F103

    高级定时器和普通定时器的区别(https://zhuanlan.zhihu.com/p/557896041): TIM1是高级定时器,使用的时钟总线是RCC_APB2Periph_TIM1,和普通定时器不一样。 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用

    2024年02月07日
    浏览(58)
  • STM32F103RCT6——定时器简单用法

    STM32F10xx参考手册英文和中文版 百度网盘:https://pan.baidu.com/s/1Z2nB0WVJIxvm3VOI9MQiiw 提取码:lxlx STM32F103RCT6数据手册 链接:https://pan.baidu.com/s/1tRchgf-5C1MN4W58vQ9zPg 提取码:lxlx STM32F103RCT6包括,高级控制定时器TIM1和TIM8,通用定时器TIM2-5,基本定时器TIM6和TIM7. 高级控制定时器TIM1,TI

    2024年02月08日
    浏览(62)
  • stm32f407单一定时器输出四路PWM波

    最近在玩遥控器多路pwm捕获,顺带着写了一下pwm波输出的代码,下面我来说一下407板子输出pwm波的具体配置及函数说明。 输出效果如下。PS:因为我的分析仪只能接一个,就只看一路的输出 1、开启时钟及定时器引脚复用 在输出PWM波时要开启定时器时钟及GPIO时钟,本例以TI

    2024年02月12日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包