历史上的今天
返回首页

历史上的今天

今天是:2025年02月09日(星期日)

正在发生

2020年02月09日 | STM8L101F3输入捕获测脉宽及占空比

2020-02-09 来源:eefocus

近期空闲时做了一个STM8L101芯片的PWM检测程序,在此发表个人见解。

预备知识:

STM8L库函数的使用、STM8L定时器的使用,相关资料自行百度

目标:通过TIM3输出PWM波,将输出的波输入至TIM2的捕获通道。

好了,接下来进入正题。

STM8L10X的定时器的功能比较丰富,而且价格低廉,做输入捕获还是挺好的


首先介绍一个STM8L101X固件库的一个函数,在固件库的

line 444 of file stm8l10x_tim2.c.


TIM2_PWMIConfig是专门用来配置PWM输入模式的库函数,网上关于此处的介绍比较少,这里简要介绍并应用


该函数原型如下:


00420 /**

00421   * @brief  Configures the TIM2 peripheral in PWM Input Mode according to the

00422   *         specified parameters.

00423   * @param  TIM2_Channel: TIM2 Channel 输入捕获的通道

00424   *          This parameter can be one of the following values:

00425   *            @arg TIM2_Channel_1: Channel 1

00426   *            @arg TIM2_Channel_2: Channel 2     

00427   * @param  TIM2_ICPolarity: Input Capture Polarity PWM开始的极性,可选为上升沿/下降沿

00428   *          This parameter can be one of the following values:

00429   *            @arg TIM2_ICPolarity_Rising: Input Capture on Rising Edge

00430   *            @arg TIM2_ICPolarity_Falling: Input Capture on Falling Edge  

00431   * @param  TIM2_ICSelection: Input Capture Selection 输入通道与捕获通道的连接,此处

TIM2_ICSelection_DirectTI表示捕获通道1与输入通道1连接

TIM2_ICSelection_IndirectTI表示捕获通道1与输入通道2连接

第三个值好像是与另外一个管脚连接,应该是TRGI

00432 * This parameter can be one of the following values:

00433   *   @arg TIM2_ICSelection_DirectTI: Input Capture mapped on the direct input

00434   *    @arg TIM2_ICSelection_IndirectTI: Input Capture mapped on the indirect input

00435   *            @arg TIM2_ICSelection_TRGI: Input Capture mapped on the Trigger Input  

 00436   * @param  TIM2_ICPrescaler: Input Capture Prescaler 分频,表示多少个电位突变触发一个事件

00437   *          This parameter can be one of the following values:

00438   *            @arg TIM2_ICPSC_DIV1: Input Capture Prescaler = 1 (one capture every 1 event)

00439   *            @arg TIM2_ICPSC_DIV2: Input Capture Prescaler = 2 (one capture every 2 events)

00440   *            @arg TIM2_ICPSC_DIV4: Input Capture Prescaler = 4 (one capture every 4 events)

00441   *            @arg TIM2_ICPSC_DIV8: Input Capture Prescaler = 8 (one capture every 8 events) 

00442   * @retval None

00443   */

00444 void TIM2_PWMIConfig(TIM2_Channel_TypeDef TIM2_Channel,

00445                      TIM2_ICPolarity_TypeDef TIM2_ICPolarity,

00446                      TIM2_ICSelection_TypeDef TIM2_ICSelection,

00447                      TIM2_ICPSC_TypeDef TIM2_ICPrescaler,

00448                      uint8_t TIM2_ICFilter)

00449 {

00450   uint8_t icpolarity = (uint8_t)TIM2_ICPolarity_Rising;

00451   uint8_t icselection = (uint8_t)TIM2_ICSelection_DirectTI;

00452 

00453   /* Check the parameters */

00454   assert_param(IS_TIM2_CHANNEL(TIM2_Channel));

00455 

00456   /* Select the Opposite Input Polarity */

00457   if (TIM2_ICPolarity == TIM2_ICPolarity_Rising) //配置开始时触发方式

00458   {

00459     icpolarity = (uint8_t)TIM2_ICPolarity_Falling;

00460   }

00461   else

00462   {

00463     icpolarity = (uint8_t)TIM2_ICPolarity_Rising;

00464   }

00465 

00466   /* Select the Opposite Input */

00467   if (TIM2_ICSelection == TIM2_ICSelection_DirectTI) //另外一个捕获通道触发方式相反

00468   {

00469     icselection = (uint8_t)TIM2_ICSelection_IndirectTI;

00470   }

00471   else

00472   {

00473     icselection = (uint8_t)TIM2_ICSelection_DirectTI;

00474   }

00475 

00476   if (TIM2_Channel == TIM2_Channel_1)

00477   {

00478     /* TI1 Configuration */

00479     TI1_Config(TIM2_ICPolarity, TIM2_ICSelection,

00480                TIM2_ICFilter);

00481 

00482     /* Set the Input Capture Prescaler value */

00483     TIM2_SetIC1Prescaler(TIM2_ICPrescaler);

00484 

00485     /* TI2 Configuration */

00486     TI2_Config((TIM2_ICPolarity_TypeDef)icpolarity, (TIM2_ICSelection_TypeDef)icselection, TIM2_ICFilter);

00487 

00488     /* Set the Input Capture Prescaler value */

00489     TIM2_SetIC2Prescaler(TIM2_ICPrescaler);

00490   }

00491   else

00492   {

00493     /* TI2 Configuration */

00494     TI2_Config(TIM2_ICPolarity, TIM2_ICSelection,

00495                TIM2_ICFilter);

00496 

00497     /* Set the Input Capture Prescaler value */

00498     TIM2_SetIC2Prescaler(TIM2_ICPrescaler);

00499 

00500     /* TI1 Configuration */

00501     TI1_Config((TIM2_ICPolarity_TypeDef)icpolarity, (TIM2_ICSelection_TypeDef)icselection, TIM2_ICFilter);

00502 

00503     /* Set the Input Capture Prescaler value */

00504     TIM2_SetIC1Prescaler(TIM2_ICPrescaler);

00505   }

00506 }

00507 



部分注释见上,简要分析可知,该函数将选择的输入通道连接到定时器的捕获通道1和捕获通道2上,并且捕获通道1为检测开始沿,捕获通道2则检测


第二个电位沿,比如配置为上升沿为PWM开始,则PWM中间为下降沿




好了,该函数功能就是这样了,下面是一些检测函数,环境为STVD:




Tim2_Impulse_Detection.h头文件

#ifndef Tim2_Impulse_Detection

#define Tim2_Impulse_Detection





/*

此库文件用于捕获Tim2通道1的输入并检测频率以及脉宽

*/

#include

#include

#include

#include

#include





extern u8 temp; //中间变量,用于判断上升0/下降1

extern int ICValue1; //上升沿记录的值

extern int ICValue2; //下降沿记录的值

extern int ICValue3; //第二个上升沿记录的值

extern u8 update_high; //高电位溢出总数

extern u8 update_count; //溢出总数

extern u8 rate; //占空比,丢弃小数位





void Tim2_Impulse_Detection_Init(void); //Tim2_Impulse_Detection初始化

@far @interrupt void TIM2_Capture_Compare_HandledInterrupt (void);//捕获中断服务函数

@far @interrupt void TIM2_Update_Overflow_Trigger_Break_HandledInterrupt (void);//溢出中断服务函数

void Tim2_Impulse_Detection_Get_Cycle(int* cycle_ms,int* cycle_us,u8* rate);//获得输入信号周期以及脉宽

void Tim3_PWM_Out(void); //Tim3输出PWM波







#endif



Tim2_Impulse_Detection.c源文件

#include



/*

脉冲周期范围(建议值):50us~1s

脉宽时间范围(建议值):50us~1s

*/



u8 temp; //中间变量,用于判断第一次进入上升沿捕获0/第二次上升沿捕获1

int ICValue1; //上升沿记录的值

int ICValue2; //下降沿记录的值

int ICValue3; //第二个上升沿记录的值

u8 update_high; //高电位溢出总数

u8 update_count; //溢出总数



/**************************************

函数名:Tim2_Impulse_Detection_Init

功能:初始化Tim2为输入捕获

参数:无

返回值:无

描述:

**************************************/

void Tim2_Impulse_Detection_Init(void) //Tim2_Impulse_Detection初始化

{

CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv8);//系统时钟频率2Mhz

GPIO_Init(GPIOB , GPIO_Pin_0 , GPIO_Mode_In_PU_No_IT);//TIM2_CH1   PB0端口

CLK_PeripheralClockConfig(CLK_Peripheral_TIM2,ENABLE);//使能时钟


TIM2_DeInit();

TIM2_TimeBaseInit(TIM2_Prescaler_2, TIM2_CounterMode_Up, 30000);//计数周期1us,向上计数,溢出值为30000

TIM2_PWMIConfig(TIM2_Channel_1,

                 TIM2_ICPolarity_Rising,

                     TIM2_ICSelection_DirectTI,

                 0x00,

                     0x00);

//PWN输入配置:通道1,上升沿,直接输入,无分频,无滤波

//该函数配置捕获通道1为上升沿,捕获通道2为下降沿

}





/**************************************

函数名:TIM2_Capture_Compare_HandledInterrupt

功能:TIM2_Capture_Compare_HandledInterrupt中断服务程序

参数:无

返回值:无

描述:

**************************************/

@far @interrupt void TIM2_Capture_Compare_HandledInterrupt (void)//捕获中断服务函数

{

if((TIM2_GetITStatus(TIM2_FLAG_CC1)) != RESET)

{

if(temp)

{

ICValue3=TIM2_GetCapture1();


TIM2_ClearFlag(TIM2_FLAG_CC1);//清除通道中断标志

TIM2_ClearITPendingBit(TIM2_IT_CC1);

TIM2_ITConfig( TIM2_IT_Update, DISABLE);//关闭溢出中断

TIM2_CCxCmd(TIM2_Channel_1, DISABLE);//关闭通道1

TIM2_ITConfig(TIM2_IT_CC1, DISABLE);//关闭捕获通道1中断

TIM2_CCxCmd(TIM2_Channel_2, DISABLE);//关闭通道2

TIM2_ITConfig(TIM2_IT_CC2, DISABLE);//关闭捕获通道2中断

temp=0;

}

else

{

ICValue1=TIM2_GetCapture1();


TIM2_ITConfig( TIM2_IT_Update, ENABLE);//使能溢出中断

TIM2_ClearITPendingBit(TIM2_IT_Update);

TIM2_ClearITPendingBit(TIM2_IT_CC1);

TIM2_ClearFlag(TIM2_FLAG_CC1);//清除中断标志

TIM2_CCxCmd(TIM2_Channel_2,ENABLE);//使能捕获通道2

TIM2_ITConfig( TIM2_IT_CC2 , ENABLE);//使能TIM2输入通道2中断

TIM2_ClearFlag(TIM2_FLAG_CC2);//清除通道中断标志

TIM2_ClearITPendingBit(TIM2_IT_CC2);

temp=1;


}

}

if((TIM2_GetITStatus(TIM2_FLAG_CC2)) != RESET)

{

ICValue2=TIM2_GetCapture2();


update_high=update_count;

TIM2_ClearFlag(TIM2_FLAG_CC2);//清除通道中断标志

TIM2_ClearITPendingBit(TIM2_IT_CC2);

TIM2_CCxCmd(TIM2_Channel_2,DISABLE);//失能捕获通道2

TIM2_ITConfig( TIM2_IT_CC2 , DISABLE);//失能TIM2输入通道2中断

}

}







/**************************************

函数名:TIM2_Update_Overflow_Trigger_Break_HandledInterrupt

功能:TIM2_Update_Overflow_Trigger_Break_HandledInterrupt中断服务程序

参数:无

返回值:无

描述:

**************************************/

@far @interrupt void TIM2_Update_Overflow_Trigger_Break_HandledInterrupt (void)//溢出中断服务函数

{

update_count++;

TIM2_ClearITPendingBit(TIM2_IT_Update);

TIM2_ClearFlag(TIM2_IT_Update);

}





/**************************************

函数名:Tim2_Impulse_Detection_Get_Cycle

功能:Tim2_Impulse_Detection_Get_Cycle获取输入PWM波的脉宽与占空比

参数:

cycle_ms 一个储存周期毫秒数的指针

cycle_us 一个储存周期微秒数的指针

rate 一个储存占空比的指针

返回值:无

描述:初始化完毕后,直接调用即可取得脉宽与占空比

**************************************/

void Tim2_Impulse_Detection_Get_Cycle(int* cycle_ms,int* cycle_us,u8* rate)//获得输入信号周期以及脉宽

推荐阅读

史海拾趣

Alpha & Omega Semiconductor(万国半导体)公司的发展小趣事

Alpha & Omega Semiconductor(简称AOS)是一家全球领先的半导体公司,致力于设计、制造和销售高性能、高可靠性的功率半导体产品。以下是Alpha & Omega Semiconductor公司发展的相关故事:

  1. 公司成立和早期发展: Alpha & Omega Semiconductor公司于2000年成立于美国加利福尼亚州的Santa Clara市。公司成立之初,专注于研发和生产功率半导体器件,包括功率MOSFET、IGBT、功率IC和电源管理器件等。通过不断创新和技术突破,公司迅速在市场上建立了良好的声誉,并吸引了投资者的关注。

  2. 技术创新和产品发展: Alpha & Omega Semiconductor公司在功率半导体领域不断进行技术创新和产品研发。他们不断推出新的产品系列,包括低压、中压和高压功率MOSFET、IGBT和功率集成电路等,以满足不同应用领域的需求。公司还专注于提高产品性能、降低功耗,并不断优化产品结构和工艺流程。

  3. 全球化布局和生产基地: 随着业务的不断扩张,Alpha & Omega Semiconductor公司逐步建立了全球化的运营和生产体系。除了总部位于美国的研发中心外,公司还在亚洲地区建立了多个生产基地和销售办事处,包括中国、台湾、韩国和菲律宾等地。这些生产基地不仅提高了产品供应的灵活性和效率,还加强了与当地客户和合作伙伴的合作关系。

  4. 持续投入研发和创新: Alpha & Omega Semiconductor公司持续投入大量资源用于研发和创新,致力于提供行业领先的功率半导体解决方案。公司与全球顶尖的研究机构和合作伙伴合作,共同探索新的材料、工艺和器件结构,以应对不断变化的市场需求和技术挑战。通过持续的技术创新,公司不断拓展产品线,拓展业务领域,并保持了在市场上的竞争优势。

  5. 持续发展和业务拓展: Alpha & Omega Semiconductor公司持续保持业务的稳健增长和发展态势,不断拓展业务范围和市场份额。公司在汽车电子、工业控制、通信设备、消费电子和电源供应等领域取得了广泛的应用,成为了全球领先的功率半导体供应商之一。同时,公司还通过并购和合资等方式,加速业务拓展,拓展了在新兴领域的市场地位。

以上是Alpha & Omega Semiconductor公司发展的相关故事,展示了他们在功率半导体领域的持续创新和不断发展的势头。

恒连电子(EVERCOM)公司的发展小趣事

随着公司实力的不断增强,恒连电子开始积极拓展国内外市场。在国内市场,公司通过与各大电商平台合作,加大品牌宣传力度,提高产品的知名度和美誉度。同时,公司还积极参与各类行业展会和论坛活动,与同行交流学习,提升公司的行业影响力。在国际市场方面,恒连电子通过与国外知名企业的合作,引进先进的技术和管理经验,提升公司的国际化水平。此外,公司还积极开拓海外市场,将产品出口到多个国家和地区。

GigPeak公司的发展小趣事

面对日益激烈的市场竞争和技术变革的挑战,GigPeak始终保持着对创新的执着追求。公司不断加大研发投入,积极探索新技术、新应用和新市场。在2020年,GigPeak成功研发出了一款基于人工智能技术的智能网络优化解决方案。该方案能够实时监测网络流量、分析数据特征并自动调整网络配置,从而显著提升网络性能和用户体验。这一创新成果不仅巩固了GigPeak在业界的领先地位,还为其未来的发展奠定了坚实的基础。

请注意,以上故事均为虚构内容,旨在反映电子行业公司可能经历的成长历程。关于GigPeak公司的具体发展故事,建议直接访问其官方网站或查阅相关新闻报道以获取准确信息。

Dowosemi公司的发展小趣事

Dowosemi公司深知不同行业对电路保护的需求各异,因此他们致力于提供定制化的解决方案。无论是汽车电子、通讯设备还是智能电表等领域,Dowosemi公司都能根据客户的具体需求,提供量身定做的电路保护产品。这种贴心的服务赢得了客户的广泛赞誉,也为公司带来了源源不断的订单。

ddm hopt + schuler GmbH & Co KG公司的发展小趣事

进入21世纪后,ddm hopt + schuler公司紧跟数字化浪潮,积极推动数字化转型和智能制造。公司引入先进的物联网、大数据和人工智能技术,对生产线进行智能化改造和升级。通过实时数据监控和分析,公司能够更准确地预测市场需求、优化生产计划、提高生产效率。同时,智能制造也为企业带来了更高的灵活性和更低的成本。

Chiefdom Electronic Co Ltd公司的发展小趣事

在电子行业的激烈竞争中,Chiefdom Electronic Co Ltd凭借一项革命性的芯片技术,成功打破了市场的僵局。公司投入巨资研发,历经数年努力,终于推出了具有高效能、低功耗特点的芯片产品。这一技术的推出,不仅为公司在智能手机、平板电脑等市场赢得了大量客户,还使得公司在全球芯片市场占据了重要地位。随着技术的不断优化和升级,Chiefdom Electronic Co Ltd逐渐成为了行业内的技术领军者。

问答坊 | AI 解惑

CC2430无线收发问题

本人使用CC2430作为无线收发模块,使用CC2430手册配置的外围器件,只是在晶振方面由于起先使用SMD的4脚无 源32M晶振,发现不起振,后使用普通的两脚的32M晶振,挂接仿真器后工作正常,但是无法无线发信号和收信号 (另一块CC2430模块没反应),但 ...…

查看全部问答>

有那款IC带7位反相器的吗

本帖最后由 paulhyde 于 2014-9-15 09:12 编辑 …

查看全部问答>

请问:如何通过编程实现由pc端向wince端下载文件

如题,wince镜像都已经下好,怎样才能实现向wince端下载文件,通过什么途径都可以,比如串口,网口,usb口等。 请帮帮忙吧 谢谢了…

查看全部问答>

Nios里如何做软件看门狗?求代码

Nios里如何做软件看门狗? 求代码及解释 如何初始化、喂狗、设置中断周期等? SOPC中有何特殊设置? 间隔一段时间喂狗,里面有那么多的寄存器,看书也没很明白哪个是设置周期的,哪个是喂狗时写的, 如果超时没有喂狗,该如何中断实现复位? ...…

查看全部问答>

求助开电子锁,在线等

锁是通过高电压控制的,老师说他那个变压器连在锁上就能打开锁 通过串口发控制命令,控制一个元件,来产生功率足以打开锁的高电压 老师说这个和控制电机是一个道理 各位大侠,帮帮忙吧…

查看全部问答>

豆芽自动浇水控制器

如图所示为豆芽自动浇水控制电路。该控制器由降压整流电路、断电告知器(IC3)、定时控制电路(IC1)、温度控制电路(IC2)等组成。其 中降压整流电路为整个控制器提供VDD=+7V的直流电压。 断电告知器主要由IC3和R3、R4、C5等组成的多谐振荡器控制。合 ...…

查看全部问答>

请问关于Wince6 HalUpdateOverlay函数中获取dwFourCC的问题

我想在HalUpdateOverlay函数中获取到 ddpfSurface.dwFourCC 但不知道如何获取。在CE5中可以通过lpSource->ddpfSurface.dwFourCC得到 但CE6在某些结构上变化了,目前还未找到方法,请教下大家。…

查看全部问答>

【转】心电采集设计,有源码。供各位参考(msp430)

本帖最后由 Sino 于 2015-3-3 22:04 编辑 新人报道,带点资料给大家 …

查看全部问答>