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的比较值运行,具体频率未测,实测效果


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

关键字:STM32  定时器输出  不同频率 引用地址:STM32一个定时器输出不同频率

上一篇:stm32 adc的dma传输案例
下一篇:stm32-esp8266驱动程序

推荐阅读

此次2018年国际泛半导体产业投资峰会上各位行业带头人物对半导体行业趋势发展以及当下的最新技术发表了精彩的演讲,小编筛选了精华部分奉献给大家,一同去了解最新、最尖端的科技前沿知识。 卢超群:硅世代4.0 X AI/IoT再造指数型经济成长 美国国家工程院院士,前GSAWSC全球主席,台湾半导体产业理事长卢超群博士在此次2018年国际泛半导体产业投资峰会的...
dma不多说了,原理啥的网上一大推,源码也有注释,理解起来很容易案例是传输adc的4个通道,需要多个或者其它的,照着修改就行。#define ADC1_DR_Address ((u32)0x40012400+0X4C) //ADC数据的地址 u16 ADC_buf[4]; //DMA传输BUF void adc_dma_init(){ GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); RCC...
今天,2020 OPPO 开发者大会(ODC20)在线上举办。大会以“智融合 共未来”为主题,OPPO 正式发布了 ColorOS 11、启能行动 2.0 和 HeyTap 健康平台,并持续探索互联网生态的开放与融合,以及如何提供更优质的服务。作为国内首发 Android 11,全新的 ColorOS 11 带来更多技术革新,在五大系统能力开放引擎的基础上,进一步开放了 AIUnit、Fus...
据新华社9月25日消息:经中国政府不懈努力,当地时间9月24日,孟晚舟女士已经乘坐中国政府包机离开加拿大,即将回到祖国,并与家人团聚。孟晚舟(资料图 来源:央视新闻)孟晚舟在中国政府包机上发布的感言:月是故乡明,心安是归途舷窗外一片漆黑,机翼上的航行灯闪烁不停,在寂静的夜空中,这些许的微光显得格外温暖。此刻,我正飞越北极上空,向着家的...

史海拾趣

问答坊 | AI 解惑

TTL 521-1和LM358怎样构成电压采集电路?

TTL 521-1和LM358怎样构成电压采集电路?多谢指教!…

查看全部问答∨

AM79C874网络接口电路图

AM79C874网络接口电路图 …

查看全部问答∨

求教一光电感应器电路

请大虾们帮忙分析下这个电路,光电三极管在有光照和无光照时右边两个npn导通情况和电压大小(非理想状态下,Uce和Ube),以及输出电压Ua的变化 多谢啦!!! [ 本帖最后由 even-shi 于 2009-7-8 22:56 编辑 ]…

查看全部问答∨

汽车可视倒车雷达方案

先上两张图,大家先了解,大家可以一起讨论一下这个行业的发展。 说说方案的一些参数供大家一起参考下: 摄像头发射参数  分辨率为420线的图像传感器  图像芯片:VC 1/3” 彩色 cmos  五金外壳和防水设计适合户外使用  镜头视觉 ...…

查看全部问答∨

error -145 whilst initialising MMC card

SD卡初始化失败,无法再/dev下看到设备,可能有什么原因?…

查看全部问答∨

如何走出中国安防品牌定位误区

一个哲理故事引发的思考   曾在《世界经理人》杂志的封面文章中看到以下这样一则故事。牧师6岁的儿子小约翰闹着要去迪斯尼乐园,弄得他心烦意乱。情急之下,他把一本杂志内的世界地图夹页撕碎,递给儿子,说如果儿子能重新拼起来就带他去。不到 ...…

查看全部问答∨

STM8L152C6读保护了,咋办?

                                 晚上试STM8L152C6通过串口bootloader,都进行到最后一步了,但是下载总是失败,选别的擦除还有读出,都显示read pr ...…

查看全部问答∨

GPS模块与单片机相连需要进行电平转换吗?

我手里有天宝BD970GPS模块,单片机采用MSP430,单片机和GPS模块相连接的时候需要电平转换吗?怎么判断是否可以直接相连或者是需要电平转换?谢谢!!!!!!!!! …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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