历史上的今天
返回首页

历史上的今天

今天是:2025年08月20日(星期三)

正在发生

2019年08月20日 | STM32 PWM捕获 两种方法详解

2019-08-20 来源:eefocus

前言:


STM32 的TIM的捕获PWM波,是为了频率和占空比,这两种数据结果!它 的最基本的原理就是(打个比方):例如一个高电平上升沿过来,捕获的数值就是上升为的高电平的TIM的计数值(TIM定时器,CNT不断增加,再重新装载),这点是最基本的内容!后面就是通过前后的数值计算可以获得占空比 频率。


第一种方法:

官方的正统方法

   IC1和IC2为一组通道,IC3和IC4为一组通道,以上图为例可以得到上升沿是IC1的值为600(假设),此时TIMx_CCR2不变,计数器复位为0,然后在下降沿的时候,IC2读取计数值 即为高电平时间300(假设),当道下一个周期的上升沿时,IC1读取为600,计数器复位为0;

void pwmIC_Init()

{

GPIO_InitTypeDef GPIO_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

 

 

TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;

TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;

TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;

TIM_ICInitStructure.TIM_ICFilter = 0x0;

 

TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);

 

TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);

 

TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);

 

TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);

 

TIM_Cmd(TIM3, ENABLE);

 

TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);

 

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

 

}

这里最关键的就是TIM_ICPolarity_Rising 为上升沿开始捕获,TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);

选择IC2为有效的输入端,就是IC2获得的就是周期了,而IC1就是在这里就是高电平的时间! 假设周期:600,高电平时间:300

可以计算的得到占空比  = 300/600, 可以得到频率 =72M/ 600;

void TIM3_IRQHandler(void)

{

 

  TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);

 

  IC2Value = TIM_GetCapture2(TIM3);

 

  if (IC2Value != 0)

  {

 

    DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC2Value;

 

 

    Frequency = SystemCoreClock / IC2Value;

  }

  else

  {

    DutyCycle = 0;

    Frequency = 0;

  }

}


以上就可以看出IC2为周期,IC1为高电平时间!


第二种方法:

     第二种方法显得比较裸,采用的就只是获取前后两次上升沿中断的计数值差,来计算周期,从而计算频率!

void TIM_Cap_Init(u16 arr,u16 prc)//²¶»ñƵÂʳõʼ»¯  

{  //PA1 PA2 ¶¨Ê±Æ÷TIM2 ͨµÀ2 3

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

TIM_ICInitTypeDef TIM_ICInitStructure;

NVIC_InitTypeDef  NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_2;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;

GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_ResetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);

NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);

TIM_TimeBaseInitStructure.TIM_Prescaler=71;

TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up ;

TIM_TimeBaseInitStructure.TIM_Period=arr;

TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);

TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;

TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;

TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;  

TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;   

TIM_ICInitStructure.TIM_ICFilter=0x0;

TIM_ICInit(TIM2,&TIM_ICInitStructure);

TIM_ICInitStructure.TIM_Channel=TIM_Channel_3;

TIM_ICInit(TIM2,&TIM_ICInitStructure);

TIM_Cmd(TIM2,ENABLE);

TIM_ITConfig(TIM2, TIM_IT_CC2 | TIM_IT_CC3,ENABLE);

}

配置了IC2,和IC3来采集两路的周期值!


void TIM2_IRQHandler(void)

{

if(TIM_GetITStatus(TIM2,TIM_IT_CC2)==SET)

{

  TIM_ClearITPendingBit(TIM2,TIM_IT_CC2);

if(flag1==0)

    {

       one=TIM_GetCapture2(TIM2);

   flag1=1;

    }

   else if(flag1==1)

   {

     two=TIM_GetCapture2(TIM2);

       if(two>one)

   { 

value1=(two-one);   

   }

      else

  {  

  value1=((0xffff-one)+two);

  }

   Get_pinlv1=36000000/value1/36;

flag1=0;  

   }

}

 

  if(TIM_GetITStatus(TIM2,TIM_IT_CC3)==SET)

{

  TIM_ClearITPendingBit(TIM2,TIM_IT_CC3);

if(flag2==0)

    {

       three=TIM_GetCapture3(TIM2);

   flag2=1;

    }

   else if(flag2==1)

   {

     four=TIM_GetCapture3(TIM2);

       if(four>three)

   { 

value2=(four-three);   

   }

      else

  {  

  value2=((0xffff-three)+four);

  }

   Get_pinlv2=36000000/value2/36;

flag2=0;  

   }

}

}

采用了点小操作,来计算前后两次上升沿的差!当然了,如果想要获取占空比的画,可以配置一个通道下降沿捕获,配合上升沿捕获即可,这里就不再示范了。


推荐阅读

史海拾趣

国芯佳品公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐中不可或缺的重要设备。它作为连接电视机与外部信号源的桥梁,不仅承担着接收数字电视信号并将其转换为适合电视播放格式的基本任务,还通过技术的不断演进,极大丰富了用户的视听体验。

从专业角度来看,机顶盒经历了从模拟到数字的飞跃,涵盖了多种类型,如DVB-S(数字卫星机顶盒)、DVB-C(有线电视数字机顶盒)、IPTV机顶盒等。这些机顶盒通过不同的传输介质(如有线电缆、卫星天线、宽带网络)接收信号,并借助内部高效的解码器,将数字信号转换成高质量的音视频流,实现了高清乃至4K超高清的播放效果。

在科普层面,机顶盒的普及极大地推动了家庭娱乐的多元化。它不仅让用户能够收看更多样化的电视节目,还能通过连接互联网,提供电子节目指南、在线视频、网页浏览、社交媒体互动等增值服务。此外,一些先进的机顶盒还集成了智能语音助手、家庭影院功能,甚至支持存储个人媒体文件,让用户的娱乐体验更加个性化、便捷化。

随着5G、云计算、人工智能等技术的不断发展,机顶盒正朝着更高清、更智能、更互动的方向迈进。它不仅将继续作为电视内容的接收和展示终端,更将成为智能家居生态系统中的重要一环,为用户带来更加丰富、沉浸的娱乐享受。

Holtek(合泰)公司的发展小趣事

Holtek(合泰)公司电子行业的五个发展故事

故事一:初创与台湾半导体产业的崛起

1983年,合德集成电路的成立标志着Holtek(合泰)的前身正式踏入半导体行业,为台湾半导体产业开启了新篇章。随着技术的不断积累和市场需求的增长,1988年,合泰半导体在新竹科学园区的建立,成为公司在晶圆制造领域的重要里程碑。这一时期,合泰半导体专注于技术创新与品质提升,逐步在竞争激烈的半导体市场中站稳脚跟,为后续的快速发展奠定了坚实基础。

故事二:晶圆制造与全球市场的拓展

进入90年代,合泰半导体迎来了快速发展期。1990年,五英寸VLSI晶圆厂的完工并开始生产,标志着公司在晶圆制造方面迈出了坚实的一步。随着生产能力的提升,合泰半导体开始积极拓展全球市场。2000年,公司股票公开发行,并通过国际ISO9001质量系统认证,进一步巩固了其在行业内的地位。同年,香港分公司的成立,以及随后在美国和上海设立的子公司,使得合泰半导体的业务版图迅速扩展至全球,加强了其在北美和大陆地区的销售与技术服务能力。

故事三:技术创新与产品研发

合泰半导体始终将技术创新视为企业发展的核心动力。进入21世纪后,公司不断推出具有竞争力的新产品,以满足市场的多样化需求。例如,在MCU(微控制器)领域,合泰半导体凭借其在低功耗、高性能方面的技术优势,成功开发出多款适用于触控、健康量测、工业控制等多个领域的MCU产品。这些产品的推出不仅丰富了公司的产品线,也进一步提升了公司在全球市场的竞争力。

故事四:物联网市场的布局与深耕

随着物联网市场的兴起,合泰半导体敏锐地捕捉到了这一新兴市场的巨大潜力。公司开始积极布局物联网领域,致力于为客户提供从硬件到软件、从芯片到解决方案的一站式服务。在智能家居、健康医疗、智慧城市等物联网应用场景中,合泰半导体凭借其专业的MCU产品和强大的技术服务能力,赢得了众多客户的信赖与合作。通过不断的技术创新和产品优化,合泰半导体在物联网市场中占据了重要地位。

故事五:人才培养与校企合作

人才是企业发展的根本。合泰半导体深知这一点,因此一直将人才培养视为企业发展的重要战略之一。公司不仅为员工提供丰富的在职培训计划和职涯提升管道,还积极与高校开展校企合作,共同培养具有创新精神和实践能力的专业人才。例如,与某高校共建单片机应用开发联合实验室,不仅为学生提供了实践锻炼的平台,也为企业输送了大量优秀人才。这种校企合作模式不仅促进了企业的技术创新和产品研发,也为行业培养了大量高素质的专业人才。

GS Technology公司的发展小趣事
如心电图机、脑电图机等,用于显示生物电信号。
GeneSiC公司的发展小趣事
首先,需要通过传感器或测量设备采集到需要显示的峰值信号。
Bytesonic Corporation公司的发展小趣事

经过几年的艰苦打拼,Bytesonic Corporation在1987年迎来了重要的转折点。这一年9月,公司资本金增至新台币500万元,为公司的进一步扩张提供了坚实的资金基础。有了更多的资本支持,公司开始加大在研发和市场推广上的投入,逐渐在行业内树立起了一定的品牌影响力。

DESOUTTER公司的发展小趣事

Desoutter公司一直注重技术创新和产品升级。公司拥有一支专业的研发团队,不断投入资源进行新产品的研发和现有产品的改进。例如,公司成功开发了一系列新型气动螺丝起子、气动钻和气动冲击扳手等,这些产品不仅提高了工作效率,还降低了劳动强度。同时,Desoutter公司还利用先进的电脑辅助技术,实现了产品设计和生产的自动化,进一步提升了产品的质量和性能。

问答坊 | AI 解惑

柴油发电机常见问题

柴油机熄火停车或运转不稳定:     柴油机启动困难或运转不稳定燃油污染或不适宜将燃油排放并以适当燃油加注燃油系统内有空气或燃油系统管路未锁紧将燃油管路排器且锁紧燃油系统管路燃油管路阻塞清洗燃油管路喷嘴总成或燃油泵失效更换喷 ...…

查看全部问答>

PADS Layout 覆铜问题

PADS Layout在灌铜时,能不能自动把死铜去掉呢?有没有自动去掉死铜这个功能?…

查看全部问答>

提供基于Vxworks的各种PowerPC平台(MPC82XX/MPC85XX/MPC7448/AMCC440GX等)

Beijing Freesense是专业PowerPC设计公司,提供基于Vxworks和Liunx的各种PowerPC平台(MPC82XX/MPC85XX/MPC7448/AMCC440GX等),提供设计开发服务。Tel: 010-82790138、13501394847,zhytang@freesense.com.cn…

查看全部问答>

PDA的FLASH坏了,换FLASH怎么烧写?

我的PDA 宏基N300 flash坏了,开机死在BOOT画面,重新用SD卡刷机也能刷过,但是还是死在BOOT画面,换好机器的FLASH能好,现在想换片新的FLASH,请问各位怎么烧写? 目前的文件有: EBOOT.bin EBOOT.nb0 flash.dio superipl.nb0 以上这几个文件是拷入S ...…

查看全部问答>

关于学习嵌入式的为题

各位高手请指点一下:我刚刚毕业,在学校接触过嵌入式的一些东西,但学的相当有限。现在想要学习嵌入式,我应该从何入手?如果我打算从事嵌入式方面的工作,我有没有参加“嵌入式培训”必要?另外,那些培训机构比较好?谢谢,各位热心人!…

查看全部问答>

MP3属于嵌入式系统吗

各位,我不是很清楚嵌入式系统,请问我们外面买的那些MP3/4属于嵌入式系统吗?还有一个问题,我在网上看到基本上嵌入式系统好像就分两种,什么LINUX和WINCE,怎么区分呢,我做MP3开发的,是C语言和汇编混合的,不知道这个是属于哪种呢?谢谢!…

查看全部问答>

FTF China 2010之行 (3)

1.       智能电网。智能电网可能是本次FTF最为突出的主题,其实去年FTF也就在推这个理念,当然大家都相信智能电网是大势所趋,飞思卡尔在智能电表和集中器方面展示了解决方案,其中集中器用的就是传说中的MCF54418 ...…

查看全部问答>

非可屏蔽中断的处理

大家好!一直用的网上的MSP430的程序框架写程序,程序的最后有一段是关于非可屏蔽中断的。程序如下: /***************************************************************************** 不可屏蔽中断函数 ************************************ ...…

查看全部问答>