历史上的今天
返回首页

历史上的今天

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

正在发生

2019年09月25日 | stm32定时器输出4路频率可调的原理分析

2019-09-25 来源:eefocus

1标题说不清楚,简单点说就是一个定时器输出4路可调节频率的pwm。


2这个功能能干嘛?


一般是用于控制多个步进电机。这样做一个定时器就可以控制4个电机了。


先上代码吧


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 = 71;     

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);

}

 

 

}

实际测试:


  CCR1_Val=1000的时候,通道1输出的是500Hz的频率,这是为什么?,我如何控制想要的频率?看完下面你应该有所体会了


 


 CCR1_Val = 1000  ->500Hz    why?


    先看看pwm输出模式 TIM_OCMode_Toggle  这个模式的意思是  CNT和CCRx 比较成功后翻转IO


    CNT是最大计数值,这里是65535,分频72.速度就是1M也就是1us计数一次,CCRx是比较值。


    CCR1_Val = 1000,就是计数1000次,也就是1ms,

  也就是说每1ms翻转一次IO口,这就意味着高电平是1ms,低电平也是1ms,那么频率是多少?没错就是500Hz.


    在看看为什么要用中断来重置比较值CCRx?

    capture = TIM_GetCapture1(TIM2);

    TIM_SetCompare1(TIM2, capture + CCR1_Val );

    

    先看看capture = TIM_GetCapture1(TIM2);              这里是获取当前比较值,也就是获取CCRx的值

    TIM_SetCompare1(TIM2, capture + CCR1_Val );    这里就是设置比较值,也就是设置CCRx的值

    可能会疑问为什么要先获取前一次的比较值,然后加上现在的比较值?

    我们分析一下原理:

    我们定时器初始化的时候前面有讲到,计数是从0-65535,那么就是CNT会按0-65535这样计数。

    CNT要和CCRx比较,假设CCRx刚开始等于1000,CNT就从0计数到1000,然后和CCRx比较成功后就翻转IO口了,

    如果不做任何改变,CNT会继续计数1001....一直到65535,在这个阶段CNT永远不会等于CCRx的1000了,

    也就意味着IO口不会再发生翻转了。那么怎么解决呢?

    定时器在比较成功后会发生中断,我们在中断里从新设置了比较值,上一次值加上这一次值。

    在上面的例子中也就是CCRx=1000+1000=2000,也就是等CNT到2000时,又可以翻转IO了。

    CNT      0...1000        1001...2000          2001...3000

    CCRx    1000            1000+1000            2000+1000

    这样不断的循环就可以连续的输出脉冲频率了,我们只需要改CCR1_Val个值就可以改变这个通道的频率了。

推荐阅读

史海拾趣

AdaptivEnergy公司的发展小趣事

AdaptivEnergy是一家专注于能量收集和管理技术的公司,以下是该公司发展的五个相关故事:

  1. 公司成立与初期发展: AdaptivEnergy成立于2007年,总部位于美国马里兰州的克拉克斯堡市。公司的创始人是一群在能源管理和微型能源收集技术领域具有丰富经验的工程师和科学家。初期,公司主要专注于研发微型能源收集器件,旨在利用环境中的振动、热能等能源,为便携设备提供持续的电源支持。

  2. 技术创新与专利保护: AdaptivEnergy在能量收集和管理领域取得了多项技术突破,并获得了相关的专利保护。公司开发的微型能量收集器件具有高效、小型化和低成本的特点,广泛应用于智能手机、传感器、医疗设备等领域。同时,公司还不断改进其技术,并积极寻求新的技术创新和专利保护,以保持竞争优势。

  3. 产品推出与市场应用: 随着技术的成熟和产品的不断完善,AdaptivEnergy推出了一系列的微型能量收集器件和解决方案。这些产品可以通过环境中的振动、光照、温差等能源源源不断地为设备提供电力支持,解决了传统电池供电存在的限制和问题。这些产品在便携式电子设备、无线传感器网络、智能健康监测等领域得到了广泛应用。

  4. 市场拓展与合作伙伴关系: AdaptivEnergy积极拓展国内外市场,并与各类客户和合作伙伴建立了稳固的合作关系。公司与电子设备制造商、系统集成商、科研机构等进行合作,共同开发定制化的能量收集解决方案,满足不同客户的需求。同时,公司还与行业协会、学术界等建立合作关系,共同推动微型能量收集技术的发展和应用。

  5. 未来展望与持续创新: 作为一家专注于微型能量收集技术的领先企业,AdaptivEnergy将继续致力于持续创新和技术提升。公司将继续投入研发资源,推出更加高效、可靠的微型能量收集器件和解决方案,以满足日益增长的市场需求。未来,AdaptivEnergy将继续在能量收集和管理领域发挥领先优势,为客户提供更加智能、便携的能源解决方案。

Goldentech Discrete Semiconductor Inc公司的发展小趣事

随着物联网、可穿戴设备等新兴领域的兴起,Goldentech敏锐地捕捉到了市场的新机遇。公司迅速调整战略方向,加大在微型化、低功耗半导体器件的研发投入。通过引入先进的制造工艺和封装技术,Goldentech成功推出了一系列适用于物联网和可穿戴设备的高性能离散半导体产品。这些产品凭借出色的性能和稳定性,在市场中获得了广泛认可,为公司的持续发展注入了新的动力。

Alutronic Kuhlkorper Gmbh & Co Kg公司的发展小趣事

在快速发展的同时,Goldentech始终关注环境保护和社会责任。公司积极推行绿色制造理念,采用环保材料和节能技术,减少生产过程中的碳排放和资源消耗。此外,Goldentech还投入大量资金研发可回收和可降解的半导体产品,旨在为全球电子行业的可持续发展贡献力量。这一环保理念不仅提升了公司的社会形象,还吸引了更多注重可持续发展的客户和合作伙伴。

ETA Electric Industry Co Ltd公司的发展小趣事

进入新世纪,ETA Electric Industry Co Ltd意识到技术创新是企业发展的关键。于是,公司开始加大研发投入,引进了一批高素质的研发人员。他们专注于开发新型电子元器件,特别是在微型化、高性能方面取得了显著成果。其中,他们研发的一种新型微型电容器,因其体积小、性能稳定而广受好评。这一技术创新不仅提升了公司的市场竞争力,还为公司赢得了更多的合作机会。

Echelon_Corporation公司的发展小趣事

作为一家技术驱动的公司,Echelon始终注重技术创新和产品研发的投入。公司拥有一支专业的研发团队,致力于开发更加先进、更加可靠的产品和技术。同时,Echelon还积极与全球范围内的科研机构、高校等合作,共同推动技术创新和产业升级。这些努力使得Echelon在电子行业始终保持领先地位。

Eagle-Picher公司的发展小趣事

进入21世纪后,Eagle-Picher公司迎来了新的发展机遇。2017年,OMGroup斥资1.7亿美元收购了Eagle-Picher公司,这一举措为Eagle-Picher注入了新的资金和资源。在新的资本支持下,Eagle-Picher加大了在电池技术领域的研发投入,不断推出新的产品和解决方案。同时,公司也积极拓展国际市场,与全球多家知名企业建立了合作关系。这些新的发展机遇为Eagle-Picher的未来发展奠定了坚实的基础。

问答坊 | AI 解惑

15075018luerdu

老师,我想用汇编语言来判断放在7FH,7DH中的数哪个大,哪个小呢。 我的思路是:如果7FH大于7DH,C就为1,                   如果7FH小于7DH,C就为0。 老师,但我不知道汇编程 ...…

查看全部问答>

高速球知识全解析

  关键字:高速球   一、 高速球综述   高速球是一种智能化摄像机前端,全名叫高速智能化球型摄像机,或者一体化高速球智能球,或者简称快球,简称高速球。高速球是监控系统最复杂和综合表现效果最好的摄像机前端,制造复杂、价格昂贵,能 ...…

查看全部问答>

哪里能买到GSM开发板

由于工作需要,急需一个GSM开发板,就是通过串口和PC相连然后通过AT命令操作的东西,请问我在那里能买到? 谁知道的话能不能给我一个联系方式? 另外我在沈阳,所以最好是沈阳的。 先谢谢了。…

查看全部问答>

硬盘不识别

我的主板是USATA接口的主板通过转接卡接IDE接口的硬盘,在BIOS里不识别,请高手赐教,谢谢!…

查看全部问答>

关于MSP430的ADC采样的问题。

如果我使用芯片内置的电压参考信号,是不是只要把采样信号线连到P6.x管脚,什么VeREF+,VREF+,VREF-管脚都不用了。如果不用是接地还是悬空呢?多谢下面回帖的人!…

查看全部问答>

LM3S的库函数源码

LM3S的库函数的源码在编写的时候经常用到 ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE) |);其中ASSERT在库函数编写的时候为什么起到什么作用。表示一个判断的语句??在LM3S的书籍中并没有发现有给它的定义啊!谁知道能不能说 ...…

查看全部问答>

FPGA引脚分配时候出现的问题

开发板是DE2,里面自带CSV文件;我直接从原CSV中找出36个需要引用的引脚配置;导入之后。然后改换成txt也出现类似问题。Info: Import completed.  36 assignments were written (out of 36 read).  0 non-global assignments were skippe ...…

查看全部问答>

如何查看CCSV4中所编译代码的大小即多少KB?

如何查看CCSV4中所编译代码的大小即多少KB?望诸位指点一二,不甚感激!!!…

查看全部问答>

STM32怎样才能输出两路相位相差180的PWM也就是相差半个周期 最好有代码 急

哪里有这样的代码 看到有人说版内有 但我找不到  怎样才能输出两路相位相差180的PWM…

查看全部问答>

第5篇Thinker board之开发工具DIY STLink/XILINX 下载线

工欲善其事,必先利其器。 最近抽时间做了Thinker Board的开发工具,先给大家过目。 具体的工具说明在附件内有详细资料,希望大家喜欢。 我想大家更在乎Thinker Board的预产期,版主正在浴血奋战,争取早日面世!!! 届时也会给坛子里的朋友最 ...…

查看全部问答>