STM32输出 PWM频率 占空比 连续可调

发布者:CreativeDreamer最新更新时间:2019-08-21 来源: eefocus关键字:STM32输出  PWM频率  占空比  连续可调 手机看文章 扫描二维码
随时随地手机看文章

话不多说 直接上代码 我的平台是 stm32F407VGT6 PA0 输出 使用定时器TIM2



//编程输出可调的硬件PWM,频率范围1Hz - 1MHz,占空比0 - 100 %


uint32_t TIM2_PWM_FQ = 50;             /* TIM2_CH1_PWM输出 频率设置值,1-1000000 */

uint32_t TIM2_PWM_FQ_Old  = 0;

uint16_t TIM2_PWM_Pulse = 50;          /* TIM2_CH1_PWM输出 占空比设置值,0-100 */

uint16_t TIM2_PWM_Pulse_Old = 0;


uint32_t SystemCoreClock = 168000000;


/*

* 函数功能: 定时器4配置为硬件PWM模式(不开启TIM2的定时及DMA传输中断)

* TIM2_PWM_FQ:     TIM2_CH1_PWM 频率    1Hz至1000000Hz

* TIM2_PWM_Pulse:  TIM2_CH1_PWM 占空比  0-100%

*/

void StdPeriph_TIM2_PWM_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    TIM_OCInitTypeDef  TIM_OCInitStructure;


    uint32_t temp32;

    uint32_t uhTimerfrequency;

    uint16_t uhTimerPeriod;

    uint16_t uhTimerPulse;


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    // GPIOB Configuration

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;

    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;

    GPIO_Init(GPIOA, &GPIO_InitStruct);


    GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM2);


    uhTimerfrequency = 200000; /* 初始化 200KHz */

    temp32 = ((SystemCoreClock / 2) / uhTimerfrequency);

    if (temp32 > 65535) temp32 = 65535;

    uhTimerPeriod = (uint16_t) temp32;

    uhTimerPulse  = uhTimerPeriod * 50 / 100; /* 占空比50% */


    // Time base configuration

    TIM_TimeBaseStructure.TIM_Period = uhTimerPeriod - 1; /* 0x0000 and 0xFFFF */

    TIM_TimeBaseStructure.TIM_Prescaler = 0; /* 0x0000 and 0xFFFF */

    TIM_TimeBaseStructure.TIM_ClockDivision = 0;

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


    // PWM1 Mode configuration: Channel1

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitStructure.TIM_Pulse = uhTimerPulse;

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;


    TIM_OC1Init(TIM2, &TIM_OCInitStructure);

    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

    TIM_ARRPreloadConfig(TIM2, ENABLE);

    TIM_GenerateEvent(TIM2, TIM_EventSource_Update);


    TIM_Cmd(TIM2, ENABLE);

}


/*

* 函数功能: 刷新TIM2_CH1_PWM输出的频率和占空比

* 修改TIM2_PWM_FQ的值,调节PWM频率(1Hz至1MHz)

* 修改TIM2_PWM_Pulse的值,调节PWM的占空比(0-100)

*/


void StdPeriph_TIM2_PWM_Update(void)

{

    uint32_t temp32;

    uint32_t uhTimerfrequency;

    uint16_t uhTimerPeriod;

    uint16_t uhTimerPrescaler;

    uint16_t uhTimerPulse;


    if ((TIM2_PWM_FQ_Old != TIM2_PWM_FQ) || (TIM2_PWM_Pulse_Old != TIM2_PWM_Pulse)) {

        TIM2_PWM_FQ_Old = TIM2_PWM_FQ;

        TIM2_PWM_Pulse_Old = TIM2_PWM_Pulse;

        if (TIM2_PWM_FQ >= 4000) {

            uhTimerfrequency = TIM2_PWM_FQ;  /* 定时器计时频率和PWM频率相等 */

            uhTimerPrescaler = 1;    /* 实际频率TIM2_PWM_FQ较大时,TIM2设置分频为1(不分频)   */

        } else {

            uhTimerfrequency = 4000; /* 实际频率TIM2_PWM_FQ较小时,和4000Hz的频率比较,看相差几倍 */

            uhTimerPrescaler = 4000 / TIM2_PWM_FQ;  /* 实际频率和4000相差的倍数作为TIM2的分频设置值 */

            uhTimerfrequency = uhTimerPrescaler * TIM2_PWM_FQ; /* TIM2分频后,计时周期变长,需要将uhTimerfrequency倍频  */

        }


        /* TIM2的周期要通过倍频uhTimerfrequency来计算,uhTimerPeriod = 84MHz / uhTimerfrequency */

        temp32 = ((SystemCoreClock / 2) / uhTimerfrequency);

        if (temp32 > 65535) temp32 = 65535;

        uhTimerPeriod = (uint16_t) temp32;


        if (TIM2_PWM_Pulse > 100) TIM2_PWM_Pulse = 100;

        uhTimerPulse = uhTimerPeriod * TIM2_PWM_Pulse / 100;


        TIM2->ARR  = uhTimerPeriod - 1;

        TIM2->PSC  = uhTimerPrescaler - 1;

        TIM2->CCR1 = uhTimerPulse;

        TIM2->EGR  = TIM_PSCReloadMode_Update;

    }

}



关键字:STM32输出  PWM频率  占空比  连续可调 引用地址:STM32输出 PWM频率 占空比 连续可调

上一篇:STM32的频率和占空比计算
下一篇:STM32实现灯的PWM输出以及定时器输入捕获频率和占空比

推荐阅读最新更新时间:2024-10-29 13:14

STM32基础PWM输出
a)目的:基础PWM输出,以及中断配合应用。输出选用PB1,配置为TIM3_CH4,是目标板的LED6控制脚。 b)对于简单的PWM输出应用,暂时无需考虑TIM1的高级功能之区别。 c)初始化函数定义: void TIM_ConfiguraTIon(void);//定义TIM初始化函数 d)初始化函数调用: TIM_Configuration();//TIM初始化函数调用 e)初始化函数,不同于前面模块,TIM的初始化分为两部分——基本初始化和通道初始化: void TIM_Configuration(void)//TIM初始化函数 { TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;//
[单片机]
STM32单片机学习(10) 数码管输出实验补 静态(共阳)+动态(共阴)
注:使用普中科技开发板测试时,需要拔掉Boot1插口 参考手册、电路图等参见 STM32单片机学习(1) 总记 学习资料+参考手册+LED灯 静态数码管实验 /* * * 软件功能: 静态数码管实验(软件延时方式) * */ #include stm32f10x.h #include delay.h void RCC_Configuration(void); void GPIO_Configuration(void); u8 Count=0; // 此表为 LED 的字模 0-f, . unsigned char LED7Code = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~
[单片机]
stm32专题三:位带操作—GPIO输出和输入
位带操作其实很简单,就是把位带区某寄存器的特定位,用公式给映射到位带别名区的32位地址上,该地址在编译器看来是个立即数,因此需要强制类型转换成32位地址指针,最后对指针取值操作。 特别值得注意的是,在强制类型转换成地址时,一定要加volatile关键词,不然一定会被编译器level-3优化掉,导致程序出错。博主一开始是直接使用(unsigned int *),然后在这里调试了很久,一直没发现问题所在,突然想到三级优化,加上volatile后程序正常执行。 以下是位带宏定义和输入—输出测试代码, #include stm32f10x.h #include bsp_led.h #include bsp_key.h
[单片机]
STM32 TIM1的PWM没有输出
设置了TIM1的CHN1及CHN4输出PWM,代码如下,但是仿真的波形不对,上设备也不正确: RCC- APB2ENR|=1 11; //TIM1时钟使能 RCC- APB2ENR|=1 2; //使能PORTA时钟 GPIOA- CRH&=0XFFFFFFF0;//PA8输出 GPIOA- CRH|=0X0000000B;//通用推挽输出 GPIOA- ODR|=1 8;//PA8上拉 GPIOA- CRH&=0XFFFF0FFF;//PA11输出 GPIOA- CRH|=0X0000B000;//通用推挽输出 GPIOA- ODR|=1 11;//PA11上拉
[单片机]
什么是脉冲宽度调制(PWM)或脉冲频率调制
什么是脉冲宽度调制(PWM)或脉冲频率调制(PFM) 所谓脉冲宽度调制的方法是一种在整个工作过程中,开关频率不变,而开关接通的时间按照要求变化的方法。 所谓脉冲频率调制的方法是一种在整个工作过程中,开关接通的时间不变,而开关频率按照要求变化的方法。 占空比的定义: 开关接通的占空比定义为D, 其中ton 为开关导通时间,TS为开关周期。
[模拟电子]
什么是脉冲宽度调制(<font color='red'>PWM</font>)或脉冲<font color='red'>频率</font>调制
STM32定时器----通用定时器输出带死区互补PWM
功能:利用一个普通定时器,输出2路互补的、频率可调、占空比可调、死区可调的PWM 原理:如下图,计数模式为中心对齐模式 可以看出,CH3高电平区间是以计数器计到4为中心,向两边延伸的。 而CH4,因为输出极性相反,是以0为中心向两边延伸的。 CCR3变小,占空比上升 CCR4变大,占空比上升 CCR3与CCR4的和为ARR 注意,此模式计数器的计数周期=ARR,这与PWM模式:计数周期 = ARR+1不同 这点参考下图STM32参考手册: 故,整理出代码以及计算公式如下: void TIM3_PWMShiftInit(void) { float Duty = 0; u16 ARR = 0,PSC = 0
[单片机]
STM32PWM波形输出配置
一. TIMER分类: STM32中一共有11个定时器,其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick。 定时器 计数器分辨率 计数器类型 预分频系数 产生DMA请求 捕获/比较通道 互补输出 TIM1 TIM8 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 有 TIM2 TIM3 TIM4 TIM5 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 没有 TIM6 T
[单片机]
<font color='red'>STM32</font>之<font color='red'>PWM</font>波形<font color='red'>输出</font>配置
使用STM32定时器输出任意相位差的方波
方法十分简单,不用说明,看图即知(这里画了2路输出,同样道理可以产生3路甚至4路输出)
[单片机]
使用<font color='red'>STM32</font>定时器<font color='red'>输出</font>任意相位差的方波
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved