单片机
返回首页

stm8s103-PWM输出与输入捕获

2021-09-26 来源:eefocus

芯片: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);        //计算频率

  }

 

}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 红外线探测报警器

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 基于ICL296的大电流开关稳压器电源电路

    相关电子头条文章