stm8s103 您所在的位置:网站首页 stm8s003与stm8s103 stm8s103

stm8s103

2024-07-10 05:39| 来源: 网络整理| 查看: 265

芯片:stm8s103F3P6

软件环境:IAR for stm8 2.20.3

功能简述:使用定时器1(PD4-Tim1_ch3)输出100Hz 50%占空比的PWM波形;

         定时器1(PC6-Tim1_ch1/2)检测输入PWM 波形频率和占空比;

在工程环境无问题情况下,在主函数中直接添加代码:

GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST); //初始化引脚为 输出推拉,低电平,10MHz TIM2_DeInit(); //定时器2寄存器恢复到默认状态 TIM2_TimeBaseInit(TIM2_PRESCALER_16, 10000); //16分频, 1MHZ 10000 = 10ms F= 100hz TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 5000, TIM2_OCPOLARITY_HIGH); //占空比50% TIM2_Cmd(ENABLE); //使能定时器2

参考链接:https://blog.csdn.net/qq_18842031/article/details/74531738

PWM输出是没问题的,但是其输入捕获问题是只能检测到频率,不能检测到占空比;

若需要同时检测频率和占空比,还需要使用定时器1的通道1和2,

代码如下:

GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT); //输入浮动,没有外部中断 TIM1_DeInit(); //tim1 定时器寄存器全部复位 TIM1_TimeBaseInit(0x0f, TIM1_COUNTERMODE_UP, 50000-1, 0);// 50ms 最小捕获50hz 设置时间分频 向上计数 捕捉50Hz及 以上的周期和占空比 TIM1_PWMIConfig(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV1, 0x00); //选择TI1输入上升沿触发 选择TI2输入下降沿触发 输入捕捉预定标器 无滤波 TIM1_SelectInputTrigger(TIM1_TS_TI1FP1); //滤波后输入TI1 TIM1_SelectSlaveMode(TIM1_SLAVEMODE_RESET);//复位输入 TIM1_ClearFlag(TIM1_FLAG_CC1); //指定要清除的标志 TIM1_ClearFlag(TIM1_FLAG_CC2); //指定要清除的标志 TIM1_ITConfig( TIM1_IT_CC1, ENABLE); //去掉是查询方式,否则是中断方式 TIM1_ITConfig( TIM1_IT_CC2, ENABLE); //去掉是查询方式,否则是中断方式 TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE); //使能输入捕获通道1 TIM1_CCxCmd(TIM1_CHANNEL_2, ENABLE); //使能输入捕获通道2 TIM1_Cmd(ENABLE); //使能定时器

但是仅仅这样写是不行的,因为PC6的定时器功能,需要使能复用功能才可以使用,不然的话,配置是无效的。

网上大佬还是很多的,详细配置方式见链接:https://blog.csdn.net/qq_18842031/article/details/77104097

最后需要稍微计算下就可以得到频率和占空比了:

INTERRUPT_HANDLER(TIM1_CAP_COM_IRQHandler, 12) { uint16_t num = 0; static uint16_t num1; static uint32_t num2; uint8_t data[11]={0}; uint8_t len = 0; if(TIM1_GetITStatus(TIM1_IT_CC1) != RESET) //如果CH1边沿触发 { num1 = TIM1_GetCapture1(); TIM1_ClearITPendingBit(TIM1_IT_CC1); //清除标志位 } else if(TIM1_GetITStatus(TIM1_IT_CC2) != RESET) //如果CH2边沿触发 { num2 = TIM1_GetCapture2(); // TIM1_ClearITPendingBit(TIM1_IT_CC2); //清除标志位 duty = ((num2 * 100) / num1); //计算占空比 fre = 1000000/( num1); //计算频率 } }

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有