历史上的今天
返回首页

历史上的今天

今天是:2024年09月25日(星期三)

正在发生

2019年09月25日 | STM32一个定时器输出不同频率

2019-09-25 来源:eefocus

1个定时器输出4路频率相同,占空比不同的PWM比较容易实现,只需要改变每个通道的比较值就可以了


要想输出频率不同,占空比相同,需要用到比较模式,当比较成功IO翻转。

同时还需要用到定时器中断去重新设置比较值。


稍微解释下面语句:

Period是计数值


prescaler是对总线时钟的分频

这个函数是设置比较值


基本要点是理解上面这些。没接触过定时器的会比较抽象,不能理解。


下面直接上代码吧


定时器初始化:


u16 capture = 0;

vu16 CCR1_Val = 32768;

vu16 CCR2_Val = 16384;

vu16 CCR3_Val = 8192;

vu16 CCR4_Val = 4096;

 

void PWM1_Init(u16 arr,u16 psc)

{

GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    TIM_OCInitTypeDef  TIM_OCInitStructure;

    TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

//开启时钟

  

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);       //使能GPIO和服用功能时钟

 

//初始化GPIO

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;    //PWM输出在PA8,9,10

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                     //复用推挽输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&GPIO_InitStructure);                               //初始化GPIO

NVIC_InitTypeDef NVIC_InitStructure;

 

NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);

 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

TIM_TimeBaseStructure.TIM_Period = 65535;       

TIM_TimeBaseStructure.TIM_Prescaler = 2;     

TIM_TimeBaseStructure.TIM_ClockDivision = 0; 

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

 

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;      //PWM模式

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //正向通道有效

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;    //输出极性

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

 

TIM_OCInitStructure.TIM_Pulse = CCR1_Val;        //占空时间

TIM_OC1Init(TIM2,&TIM_OCInitStructure);        //通道1

TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);

 

TIM_OCInitStructure.TIM_Pulse = CCR2_Val;        //占空时间

TIM_OC2Init(TIM2,&TIM_OCInitStructure);        //通道2

TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);

 

TIM_OCInitStructure.TIM_Pulse = CCR3_Val;        //占空时间

TIM_OC3Init(TIM2,&TIM_OCInitStructure);        //通道3

TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);

 

TIM_OCInitStructure.TIM_Pulse = CCR4_Val;        //占空时间

TIM_OC4Init(TIM2,&TIM_OCInitStructure);        //通道4

TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);

 

TIM_Cmd(TIM2,ENABLE);

 

 

TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);

}

定时器中断:


extern "C" void TIM2_IRQHandler(void)

{

 

if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)

{

TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 );

capture = TIM_GetCapture1(TIM2);

TIM_SetCompare1(TIM2, capture + CCR1_Val );

}

 

if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)

{

TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);

capture = TIM_GetCapture2(TIM2);

TIM_SetCompare2(TIM2, capture + CCR2_Val);

}

 

if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)

{

TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);

capture = TIM_GetCapture3(TIM2);

TIM_SetCompare3(TIM2, capture + CCR3_Val);

}

 

if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)

{

TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);

capture = TIM_GetCapture4(TIM2);

TIM_SetCompare4(TIM2, capture + CCR4_Val);

}

 

 

}

主函数:

通道4先按10的比较值运行,具体频率未测,如果按1000的比较值运行,具体频率未测,实测效果


频率输出要做线性修正,没时间去研究,有空在完善。

推荐阅读

史海拾趣

台湾奇力(Chip)公司的发展小趣事

面对激烈的市场竞争,奇力公司不断推出具有创新性和差异化的产品。例如,奇力公司最近主推平板衬底芯片,通过调整产品尺寸和价格策略,与竞争对手形成差异化竞争。这种策略不仅提升了奇力公司的市场份额,也提高了客户的满意度和忠诚度。

Hanghsing Enterprise Co Ltd公司的发展小趣事

奇力公司的成功离不开与奇美集团的紧密合作。奇美集团是台湾知名的面板生产厂家,拥有强大的技术实力和市场份额。奇力公司作为奇美集团的子公司,得到了奇美集团在技术、资金和市场等方面的全力支持。通过与奇美集团的紧密合作,奇力公司得以快速发展,并在LED芯片市场上取得了显著的成绩。

ENTRELECUK公司的发展小趣事

面对数字化转型的浪潮,ENTRELEC UK积极拥抱新技术,推动智能制造的发展。公司引入先进的自动化设备和信息化系统,提高生产效率和产品质量。同时,公司还加强了对大数据和人工智能技术的应用研究,以便更好地满足客户的需求并提供更优质的服务。这些努力使ENTRELEC UK在数字化转型的浪潮中保持领先地位。

请注意,以上故事均为虚构,但基于ENTRELEC UK公司的一般信息和电子行业的普遍趋势进行创作。如有需要,建议查阅相关新闻报道或公司官方资料以获取更准确的信息。

DB Lectro Inc公司的发展小趣事

DB Lectro Inc公司自创立之初,就致力于气体检测技术的研发与创新。在公司总部的加利福尼亚州研发中心,一群充满激情的工程师们夜以继日地工作,成功研发出了首款高精度、高稳定性的气体检测仪器。这款产品凭借其卓越的性能和精准的检测结果,迅速在污水处理、化工等领域打开了市场。随着技术的不断进步和产品的不断升级,DB Lectro Inc逐渐在气体检测领域树立了领先地位。

EPCOS/TDK公司的发展小趣事

自上世纪60年代起,TDK就开始在中国布局。首先,在台湾建立合资公司,随后在香港设立销售网络及生产线。进入80年代后,TDK正式踏足中国大陆,在华东及华南多个地区建立生产基地,并逐渐将业务扩展至全国。TDK在中国的发展不仅推动了当地电子工业的进步,也为公司自身赢得了广阔的市场空间。目前,TDK在中国的员工人数近6万人,占TDK全球员工总数的近55%。

EPSON公司的发展小趣事

随着业务的不断发展,EPSON开始积极拓展国际市场。公司先后在全球五大洲设立了多个生产和研发机构,以及销售和服务网点,以便更好地服务全球客户。通过不断拓展海外市场,EPSON逐渐实现了全球化战略,其产品和服务已经覆盖全球多个国家和地区。

问答坊 | AI 解惑

上传一本Keil C实例教程

一共5个PDF文档。 [ 本帖最后由 lycdl 于 2008-7-10 12:16 编辑 ]…

查看全部问答>

单片机常用子程序

本帖最后由 paulhyde 于 2014-9-15 09:28 编辑 很多的常用模块程序,希望对初学者还说有一定的帮助,更容易上手~~  …

查看全部问答>

嵌入式通信设备开发

通过介绍二层交换机、7信令分析仪、ATM信元收发卡和GSM信令测试仪等真正的通信设备的开发来说明MPC8260在通信设备开发过程,市面上非常少见。 辅以大量代码、分析和注释,使读者很快能进行嵌入式通信设备的开发。信令分析仪动辄几万,有的甚至几十 ...…

查看全部问答>

各位高手,最近在做一个大型PC软件移植到WINCE平台的项目,请教几个问题!

公司项目需要,最近一直在准备将公司原来的PC平台的一个软件移植到WINCE5.0下,由于软件很大,今天移植了一个模块,发现原来软件需要的winbase.h里的_lopen()函数在Wince的相应库里面没有实现,还有就是PC平台的setupapi.h在Wince平台下没有找到这 ...…

查看全部问答>

stc下载线用不了

stc单片机xtal2和xtal1为什么没有电压…

查看全部问答>

简单的创意——年发电量4720万千瓦

一个简单的想法,可以存储不少能量   2月25日消息,桥梁始终暴露在自然环境下,经受着各种气候条件和天气状况的考验。令人感到不解的是,一直以来人们未曾想过借助这些巨大的人造结构利用生态友好型天然能源。现在,意大利设计师提出了建造 ...…

查看全部问答>

TI赠送的28035和28027的开发板原理图(controlsuite中找不到的)

TI赠送的28035和28027的开发板原理图(controlsuite中找不到的)    …

查看全部问答>

富士通DIY家庭物联网整合帖(未完)

这几天开始最后的整合,我首先从厨房的部分开始的,因为厨房的做的比较完善,这里感谢下。根据他的修改说明,对电路进行相应的修改。但是复位电路没有按照他的要求进行修改。插上LAUCHPAD的调试线,通电下载。果然错误来了(如下图,估计很多同学都 ...…

查看全部问答>

第二周beaglebone试用开发板芯片测试单桨时发现是假了

板子做好一段时间了之前没怎么理会它上的全性能测试M3 M4 系列它是兼优了无刷电机projcet的所以就没多大理会 结果今天应用它下载单桨测试程序是发现有问题老提示。。警告提示但我们买的芯片的型号是没问题的啊但想起以前我们遇到的问题一想起我觉的 ...…

查看全部问答>

提问+自己做的16*16点阵亮度不均应该怎么解决

自己diy的一个16*16的点阵,使用4个595级联 可是为什么亮度不均 ,如果 明显哪一行点亮的点越多哪一行就暗   上图!  虽然年快过去了0.0 …

查看全部问答>