大家好,我是单片机爱好者-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、数据手册等所有相关资料。