• 2023版 STM32实战6 输出比较(PWM)包含F407/F103方式


    输出比较简介和特性

    -1-只有通用/高级定时器才能输出PWM

    -2-占空比就是高电平所占的比例

    -3-输出比较就是输出不同占空比的信号

    工作方式说明

    -1-1- PWM工作模式
    在这里插入图片描述

    -1-2- 有效/无效电平

    有效电平可以设置为高或低电平,是自己配置的

    周期选择与计算

    周期=重装载 * 预分频值 / 时钟频率
    在这里插入图片描述
    arr和psc是自己定义的 时钟频率可以查看时钟树,即下图中的84MHZ

    在这里插入图片描述
    在这里插入图片描述

    F1和F4采用的时钟频率

    F1通过72MHZ分频

    F4通过84MHZ分频

    HZ代表单位时间震荡次数,如1MHZ,就是一秒震荡1000000次

    代码分享(一路PWM输出,F1可直接使用)

    void TIM3_PWM_Init(u16 arr,u16 psc)
    {  
    	GPIO_InitTypeDef GPIO_InitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	TIM_OCInitTypeDef  TIM_OCInitStructure;
    	
    
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//使能定时器3时钟
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
    	
    	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5    
     
       //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形	GPIOB.5
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
     
       //初始化TIM3
    	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
    	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    	
    	//初始化TIM3 Channel2 PWM模式	 
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
     	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
    
    	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
     
    	TIM_Cmd(TIM3, ENABLE);  //使能TIM3
    	
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    代码分享(四路PWM输出,F4可直接使用)

    #include "stm32f4xx.h"
    
    
    
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    uint16_t CCR1_Val = 333;
    uint16_t CCR2_Val = 249;
    uint16_t CCR3_Val = 166;
    uint16_t CCR4_Val = 83;
    uint16_t PrescalerValue = 0;
    
    
     void TIM_Config(void);
     void PWM_Config (void);
    int main()
    {
    
    	TIM_Config();
    	PWM_Config();
    	while (1)
    	{
    		
    	
    	}
    
    
    
    }
    
    
    
    
     void TIM_Config(void)
     {
    	GPIO_InitTypeDef GPIO_InitStructure;
    
       /* TIM3 clock enable */
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
     
       /* GPIOC clock enable */
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
      
       /* GPIOC Configuration: TIM3 CH1 (PC6), TIM3 CH2 (PC7), TIM3 CH3 (PC8) and TIM3 CH4 (PC9) */
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
    	GPIO_Init(GPIOC, &GPIO_InitStructure); 
     
       /* Connect TIM3 pins to AF2 */  
    	GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);
    	GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3); 
    	GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_TIM3);
    	GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM3); 
     }
    
    
    void PWM_Config (void)
    {
    	PrescalerValue = (uint16_t) ((SystemCoreClock /2) / 21000000) - 1;
    	
    	/* Time base configuration */
    	TIM_TimeBaseStructure.TIM_Period = 665;
    	TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
    	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    	
    	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    	
    	/* PWM1 Mode configuration: Channel1 */
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    	TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    	
    	TIM_OC1Init(TIM3, &TIM_OCInitStructure);
    	
    	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
    	
    	/* PWM1 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_Enable);
    	
    	/* PWM1 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_Enable);
    	
    	/* PWM1 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_Enable);
    	
    	TIM_ARRPreloadConfig(TIM3, ENABLE);
    	
    	/* TIM3 enable counter */
    	TIM_Cmd(TIM3, ENABLE);
    
    
    
    }
     
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115

    全部工程获取

    三联,关注后点击头像获取

  • 相关阅读:
    讯飞AI算法挑战大赛-校招简历信息完整性检测挑战赛-三等奖方案
    SpringFramework 之EnableCaching
    Winserver安装Linux虚拟机执行java程序踩坑
    网络计算器(使用json序列化/反序列化,条件编译,注意点),json介绍+语法介绍
    Codeforces Round #811 (Div. 3)A.B.C.E
    SELinux
    【Spring Cloud】新闻头条微服务项目:使用Reids延迟队列实现文章定时发布(下)
    Ubuntu 安装 Zotero, 并导入原有数据库,然后同步账户
    Swift 准备取代 Python,为什么 Swift 太早野心勃勃,以及这将如何影响它的未来
    子切片的长度和容量
  • 原文地址:https://blog.csdn.net/lllmeimei/article/details/133578580