STM8S_库函数_TIM1测量PWM周期和占空比

大家好,我是单片机爱好者-MCU起航。这一节依然介绍如何使用库函数方式控制STM8S103F3P6片上的定时器1,也就是TIM1。上一节说了如何使用TIM1测量PWM的周期,但有时候,只测量周期是不够的。所以这一节看一下如何使用TIM1来测量PWM的周期和占空比。

数据手册中也有详细的说明,这种模式是输入捕获模式的一种特例,主要和输入捕获模式有以下区别:

1、两个ICi信号被映射至同一个TIi输入。怎么理解,看图:

TI1的信号同时被映射到IC1和IC2。

2、这两个ICi信号的有效边沿的极性相反。假设IC1设置为上升沿有效,那么IC2要设置为下降沿有效,反之亦然。

3、其中一个TIiFP信号被作为触发输入信号,而触发模式控制器被配置成复位触发模式。什么意思?假设,设置IC1那里的信号为触发输入信号,IC1检测到有效上升沿,TIM1先把负责计数的寄存器清零,然后开始计数。这是复位触发!

所以,通过对一个信号的两路监测,实现PWM的周期和占空比的测量。示意图如下:

IC1测量周期,IC2测量占空比。

#include "stm8s.h"

/**
  * @addtogroup TIM1_Input_Capture
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
uint32_t TIM1ClockFreq = 2000000;
__IO uint32_t LSIClockFreq = 0;
uint16_t ICValue1 =0, ICValue2 =0, ICValue3 =0, ICValue4 =0;

/* Private function prototypes -----------------------------------------------*/
static void TIM1_Config(void);
/* Private functions ---------------------------------------------------------*/
/* Public functions ----------------------------------------------------------*/

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
void main(void)
{

  /* TIM1 configuration -----------------------------------------*/
  TIM1_Config();
    

  
  /* Insert a break point here */
  while (1)
  {
  /* wait a capture on CC1 */
    while((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);
    /* Get CCR1 value*/
    ICValue1 = TIM1_GetCapture1();
    TIM1_ClearFlag(TIM1_FLAG_CC1);
    
    /* wait a capture on cc2 */
    while((TIM1->SR1 & TIM1_FLAG_CC2) != TIM1_FLAG_CC2);
    /* Get CCR2 value*/
    ICValue2 = TIM1_GetCapture2();
    TIM1_ClearFlag(TIM1_FLAG_CC2);
    
 //   ICValue2 = ICValue2 - ICValue1;
  }
}

/**
  * @brief  Configure TIM1 to to capture the internal clock source
  * @param  None
  * @retval None
  */
static void TIM1_Config(void)
{

  TIM1_PWMIConfig(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, 
                  TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV8, 0x00);
  TIM1_PWMIConfig(TIM1_CHANNEL_2, TIM1_ICPOLARITY_FALLING, 
                  TIM1_ICSELECTION_INDIRECTTI, TIM1_ICPSC_DIV8, 0x00);


  TIM1_SelectInputTrigger(TIM1_TIXEXTERNALCLK1SOURCE_TI1);
  TIM1_SelectSlaveMode(TIM1_SLAVEMODE_RESET);
  TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE);
  TIM1_CCxCmd(TIM1_CHANNEL_2, ENABLE);

  /* Enable TIM1 */
  TIM1_Cmd(ENABLE);

  /* Clear CC1 Flag*/
  TIM1_ClearFlag(TIM1_FLAG_CC1);
}

因为这部分代码和上一节很像,所以我们粗略的看一下。函数TIM1_Config中,主要执行以下几个操作:

1、PWM的通道1配置,上升沿触发,IC信号直连,8分频,无滤波。

2、PWM的通道2配置,下升沿触发,IC信号从TI1映射过来,8分频,无滤波。

3、设置IC1的信号为触发源,模式为触发复位模式。

4、使能这两个通道,使能TIM1。

5、清除捕获标志。

然后进入主函数中开始while(1)循环。跟图中表示的一样,ICValue1得到的是周期,ICValue2得到的是占空比。

注意事项:

TIM1的通道1和通道2在STM8S103F3P6的PC6和PC7上面,如图:

但由于该功能属于映射后的备选功能,所以,如果要开启的话,需要修改选项字。方法很简单,通过下载工具STVP,使用ST-LINK线连接单片机,修改即可。

最后,编译、下载、上电,功能正常!

打完收工!

要获取该程序完整的工程文件,可以关注公众号:单片机爱好者,然后回复关键词:STM8S。可以获取完整的下载链接,里面包含工程文件、视频、PPT、数据手册等所有相关资料。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据