历史上的今天
返回首页

历史上的今天

今天是:2025年08月21日(星期四)

正在发生

2019年08月21日 | STM32输出 PWM频率 占空比 连续可调

2019-08-21 来源:eefocus

话不多说 直接上代码 我的平台是 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;

    }

}



推荐阅读

史海拾趣

Amidon Associates Inc公司的发展小趣事

由于Amidon Associates Inc并非一个广为人知的电子行业公司,我无法提供关于该公司的具体发展故事。此外,撰写五个详尽且真实的故事需要详细的公司内部资料,这超出了我的能力范围。不过,我可以提供一个通用的框架,你可以根据这个框架来构建关于一个电子行业发展起来的故事。

故事框架示例

故事一:技术创新引领发展

Amidon Associates Inc自创立之初,就致力于电子技术的研发与创新。公司创始人XXX凭借其深厚的电子工程背景,带领团队开发出了一款具有划时代意义的电子产品——[产品名称]。这款产品以其卓越的性能和独特的设计,迅速在市场上占据了一席之地。随着技术的不断迭代,公司又推出了一系列衍生产品,逐步巩固了在行业内的领导地位。

故事二:市场拓展与战略合作

随着产品线的不断丰富,Amidon Associates Inc开始积极拓展国内外市场。公司通过与大型零售商建立合作关系,将产品推向更广泛的消费者群体。同时,公司还积极寻求与其他电子企业的战略合作,共同开发新技术和新市场。这些合作不仅带来了丰厚的利润,也提升了公司在行业内的知名度和影响力。

故事三:人才培养与团队建设

Amidon Associates Inc非常重视人才培养和团队建设。公司定期举办内部培训和技术交流活动,提升员工的技能水平和团队协作能力。此外,公司还积极引进外部人才,吸引了一批业内精英加入。这些优秀的人才为公司的发展提供了强大的智力支持。

故事四:品质管理与品牌建设

品质是Amidon Associates Inc的生命线。公司建立了严格的质量管理体系,从原材料采购到生产过程控制,再到产品检验和售后服务,都严格按照标准进行。同时,公司还注重品牌建设,通过广告宣传和公关活动提升品牌形象。这些努力使得Amidon Associates Inc的产品在市场上获得了良好的口碑和信誉。

故事五:社会责任与可持续发展

作为一家有社会责任感的企业,Amidon Associates Inc始终关注环境保护和社会公益事业。公司积极采用环保材料和节能技术,减少生产过程中的污染排放。同时,公司还参与多项社会公益活动,为社会的发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为其可持续发展奠定了坚实的基础。

请注意,以上故事是基于一个假设的框架构建的,并非关于Amidon Associates Inc公司的真实故事。如果你需要关于该公司的具体故事,建议查阅相关资料或联系该公司进行了解。

e2v technologies公司的发展小趣事

为了进一步提升整体实力,e2v在发展过程中进行了多次收购与整合。这些收购不仅增强了公司的技术实力和市场竞争力,也为其带来了更多的客户资源。例如,e2v曾收购了一家专注于医疗成像技术的公司,这一举措使其在医疗成像领域取得了显著的进展。

Crocus Technology公司的发展小趣事

Crocus Technology的创立源于2006年法国格勒诺布尔的自旋电子学Spintec研究实验室。这家公司在创立之初就面临着巨大的挑战,因为磁阻随机存取存储器(MRAM)市场当时竞争激烈,众多公司因技术难题和市场定位不当而相继倒闭。然而,Crocus Technology凭借其独特的技术视角和坚定的市场信念,成功地在这场竞争中生存下来。

Alorium Technology公司的发展小趣事

随着技术的不断成熟和市场需求的变化,Crocus Technology开始拓展其产品线。2015年,公司成功推出了首款磁开关产品,这标志着公司在磁传感器领域迈出了重要的一步。随后,公司又陆续推出了位置传感和2D传感器产品,进一步巩固了其在磁传感器市场的地位。

康奈特(CNNT)公司的发展小趣事

面对数字化浪潮的冲击,康奈特积极响应并开始了数字化转型之路。公司引进了先进的智能制造设备和技术手段,实现了生产线的自动化和智能化升级。同时,公司还建立了数字化管理平台,实现了对生产、销售、库存等各个环节的实时监控和管理。这种数字化转型不仅提高了生产效率和质量稳定性,也为公司未来的发展奠定了坚实的基础。

ARCOLECTRICSWITCHES公司的发展小趣事

在市场竞争日益激烈的情况下,ARCOLECTRIC SWITCHES公司始终坚持质量至上的原则。公司建立了完善的质量管理体系,从原材料采购到生产加工、产品检验等各个环节都严格把关,确保产品质量符合客户要求。同时,公司不断创新升级产品,推出更加智能化、节能环保的新型开关产品,满足市场不断变化的需求。

问答坊 | AI 解惑

2009总评表

本帖最后由 paulhyde 于 2014-9-15 08:56 编辑 2009总评表  …

查看全部问答>

直流逆变器的研究

直流逆变器的研究…

查看全部问答>

有关C8051F410的RS485通讯的IO配置

我现在是用的C8051F410单片机芯片,要实现RS485通讯: P0.5为TX,P0.4为RX,P0.3为开关, 请问有没有知道如何配置他们的端口以及程序,实现收发AD端口的数据的通讯功能!…

查看全部问答>

移植goahead webserver的问题

..\\main.c:28: ..\\uemf.h: No such file or directory ..\\main.c:29: ..\\wsIntrn.h: No such file or directory 以上两个头文件均已经加入,但还是出现错误! dependency generation failed: ccppc: No input files 提示这个 怎么弄tffs ...…

查看全部问答>

GSM modem与GSM modem连接,必须用data card为SIM card才能做文字传送吗?

如题。因为我用电话的SIM卡,怎么都不能进入data call的模式来传送文字。很急。。希望得到帮助~…

查看全部问答>

wince 2.11是否支持.net

如题, 如果不支持那怎么开发程序(各种语言都可) 如有资料请传给我 shuwu520@sina.com…

查看全部问答>

求助

初来乍到 请问各位大虾有什么MSP430的资料供小生参考…

查看全部问答>

FPGA与DSP间的通信

•    跨时钟域的设计:FIFO,双RAM,RAM+MUX,等 •    编写FPGA程序实现DSP的外设 •    编写DSP程序,通过EMIF接口访问FPGA内部的存储器…

查看全部问答>

我有一个创意想找人合作设计

因为本人不是电子工程专业的,只是脑袋里有了想法,但是不知道怎么去实现。我现在大概说下我这个产品的概况,有兴趣的各位大师希望不吝赐教 首先它是一个通信设备,一部产品包括主机和子机两部分。 功能方面: 主机可不通过允许单方面与子机建立 ...…

查看全部问答>