stm32 pwm

   GPIO_InitTypeDef GPIO_InitStructure2;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
        TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
        //第一步:配置时钟        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|
                                                   RCC_APB2Periph_GPIOB|RCC_APB2Periph_TIM1,ENABLE);
        //第二步,配置goio口
/********TIM1_CH1 引脚配置*********/        
        GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_8;
        GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_AF_PP;                 //设置为复用浮空输出
        GPIO_Init(GPIOA,&GPIO_InitStructure2);
        /*********TIM1_CH1N 引脚配置********/
        GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_13;
        GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_AF_PP;                 //设置为复用浮空输出
        GPIO_Init(GPIOB,&GPIO_InitStructure2);

//第三步,定时器基本配置        
TIM_TimeBaseStructure.TIM_Period=1000-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;//重复寄存器,用于自动更新pwm占空比                        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
        
//第四步pwm输出配置
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;                    //设置为pwm1输出模式
        TIM_OCInitStructure.TIM_Pulse=500;                                            //设置占空比时间
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;                 //设置输出极性
        TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;        //使能该通道输出
        //下面几个参数是高级定时器才会用到,通用定时器不用配置
        TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;        //设置互补端输出极性
        TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;//使能互补端输出
        TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset;        //死区后输出状态
        TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;//死区后互补端输出状态
        TIM_OC1Init(TIM1,&TIM_OCInitStructure);                                            //按照指定参数初始化

//第五步,死区和刹车功能配置,高级定时器才有的,通用定时器不用配置
        TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Disable;//运行模式下输出选择 
        TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;//空闲模式下输出选择 
        TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;         //锁定设置
        TIM_BDTRInitStructure.TIM_DeadTime = 0x90;                                         //死区时间设置
        TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;                 //刹车功能使能
        TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;//刹车输入极性
        TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;//自动输出使能 
        TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);

//第六步,使能端的打开
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIMx在CCR1上的预装载寄存器
        TIM_ARRPreloadConfig(TIM1, ENABLE);                //使能TIMx在ARR上的预装载寄存器
        TIM_Cmd(TIM1,ENABLE);                                                           //打开TIM2
        //下面这句是高级定时器才有的,输出pwm必须打开
        TIM_CtrlPWMOutputs(TIM1, ENABLE);                                   //pwm输出使能,一定要记得打开

TIM_OC1PreloadConfig(),TIM_ARRPreloadConfig();这两个函数控制的是ccr1和arr的预装在使能,使能和失能的区别就是:使能的时候这两个局存期的读写需要等待有更新事件发生时才能被改变(比如计数溢出就是更新时间)。失能的时候可以直接进行读写而没有延迟。
另外在运行当中想要改变pwm的频率和占空比调用:TIM_SetAutoreload() 
TIM_SetCompare1()这两个函数就可以了。

时间: 2024-10-05 18:41:40

stm32 pwm的相关文章

STM32 PWM配置

一:配置TIM3的ARR寄存器和PSC寄存器,确定PWM频率. 这里配置的这两个定时器确定了PWM的频率,我的理解是:PWM的周期(频率)就是ARR寄存器值与PSC寄存器值相乘得来,但不是简单意义上的相乘,例如要设置PWM的频率参考上次通用定时器中设置溢出时间的算法,例如输出100HZ频率的PWM,首先,确定TIMx的时钟,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,这时的TIMx时钟为72MHz,用这个TIMx时钟72MHz除以(PSC+1),得到定时器

STM32 PWM波

利用STM32产生占空比可以调节的PWM波 科普:pwm(Pulse Width Modulation)脉宽调制 关于pwm波的产生:1.首先来看一下代码: pwm波模式的相关配置(利用的是定时器TIM3) static void TIM3_Mode_Config(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; //最初状态,设定的高低电平的跳变值 u16 C

stm32 PWM & 定时器总结

学习后发现stm32的定时器功能确实很强大,小总结一下方便以后使用的时候做参考.Stm32定时器一共分为三种:tim1和tim8是高级定时器,6和7是基本定时器,2-5是通用定时器.从名字就可以看得出来主要功能上的差异.今天我主要是用定时器做pwm输出,所以总结也主要是针对pwm方面的. 先大致说下通用和高级定时器的区别.通用的可以输出四路pwm信号互不影响.高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路. 所以这样算下来stm32一共可以生成4*5+7*2=30路pwm信号

STM32 PWM输出(映射)

STM32 的定时器除了 TIM6 和 7.其他的定时器都可以用来产生 PWM 输出.其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出.而通用定时器也能同时产生多达 4路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM 输出! 要使 STM32 的通用定时器 TIMx 产生 PWM 输出,分别需要用到3个寄存器:捕获 /比较模式寄存器(TIMx_CCMR1/2).捕获/比较使能寄存器(TIMx_CCER).捕获/比较寄存器(TIMx_CCR

STM32——PWM基本知识及配置过程

将通用定时器分为四个部分: 1,选择时钟 2,时基电路 3,输入捕获 4,输出比较 本节定时器PWM输出主要涉及到定时器框图右下方部分,即输出比较部分 和上一讲相同,时基时钟来源于内部默认时钟 对此有疑问请参考 : 定时器中断实验 中 定时器时钟选择部分 和 定时器时钟来源部分 什么是PWM 脉冲宽度调制(PWM),是英文"Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量.通信到功率控

[pwm]PWM的输入捕捉模式

对于stm32来说,输入捕捉模式有两种: 普通输入捕捉模式:经常用来测量脉冲宽度和频率,例如测量脉冲宽度,TIM5_CH1来捕获高电平脉宽,首先先设置输入捕获为上升沿触发,然后记录下发生上升沿时TIM5_CNT值.再然后,设置捕获信号为下降沿,在下降沿到来的时候,记录下此时的TIM5_CNT值.这样一来,两次TIM5_CNT值只差即为脉冲宽度.只设置上升沿触发则可以捕获信号周期. PWM输入捕捉模式:pwm输入捕获模式是普通输入模式一种特殊应用,是将TIMx输入映射了两个ICx信号(输入捕获装置

【智能硬件我来了】(一)开发目标及硬件选购

最近做一个项目,需要硬件控制的功能,既然要做就要做全套,今后会记录一些项目进展细节希望能够为项目总结积累一些资料和心得. 项目目标: 1.能控制硬件,hardware 2.能够连接到网络中,iot 3.手机能控制,mobility 4.pc能控制 看着目标心里一阵空虚…… 完全没搞过啊 经过一周的苦苦挣扎,完成了如下的清单,准备进入学习阶段 1.stm32030系列开发板 2种 2.stm32103系列开发板 3种 3.8266系列开发板两块 4.面包板若干 5.数据线若干 6.四驱小车底盘一块

STM32中的PWM的频率和占空比的设置

转于http://blog.csdn.net/liming0931/article/details/8491468 下面的这个是stm32的定时器逻辑图,上来有助于理解: TIM3的ARR寄存器和PSC寄存器, 确定PWM频率.这里配置的这两个定时器确定了PWM的频率,我的理解是:PWM的周期(频率)就是ARR寄存器值与PSC寄存器值相乘得来,但不是简单意义上的相乘,例如要设置PWM的频率参考上次通用定时器中设置溢出时间的算法,例如输出100HZ频率的PWM,首先,确定TIMx的时钟,除非APB

stm32寄存器版学习笔记05 PWM

STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟,配置PA8为复用输出 APB2外设时钟使能寄存器(RCC_APB2ENR) APB1外设复位寄存器 (RCC_APB1RSTR) 置1开启.清0关闭. Eg:RCC->APB2ENR|=1<<11; //使能TIM1时钟 配置I/O口: 参见stm32寄存器版学习笔记01 GPIO口的配置