MyCollege1999 2023-12-07 09:11 采纳率: 73.3%
浏览 25
已结题

STM32F103ZET6芯片有办法用TIM3 CH3、CH4捕获到占空比吗?

TIM8输出4路PWM信号,想用TIM3的4个通道测量pwm,可否?看有的帖子说PWM输入模式,“由于只有 TI1FP1 和 TI2FP2 连到了从模式控制器,所以 PWM 输入模式只能使用 TIMx_CH1/TIMx_CH2信号。”
测量占空比,只能用CH1、CH2么?

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-07 12:10
    关注

    【以下回答由 GPT 生成】

    回答:

    在STM32F103ZET6芯片上,TIM8的输出可用于生成4路PWM信号,而TIM3的CH3和CH4通道是可以用来捕获占空比的。根据MCU的技术手册中对TIM8和TIM3的引脚功能说明,可以使用TIM3的CH3和CH4通道来测量TIM8输出的PWM信号的占空比。

    下面是使用HAL库的一个示例代码,演示如何配置TIM8和TIM3来实现该功能:

    #include "stm32f1xx_hal.h"
    
    TIM_HandleTypeDef htim8;
    TIM_HandleTypeDef htim3;
    
    void TIM8_Config(void)
    {
      TIM_OC_InitTypeDef sConfigOC;
    
      // 初始化TIM8外设时钟
      __HAL_RCC_TIM8_CLK_ENABLE();
    
      // 配置TIM8基本定时器参数
      htim8.Instance = TIM8;
      htim8.Init.Prescaler = 0; // 不分频
      htim8.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim8.Init.Period = 999; // 设置PWM周期为1000个计数值
      htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
      HAL_TIM_PWM_Init(&htim8);
    
      // 配置TIM8通道1和2为PWM模式
      sConfigOC.OCMode = TIM_OCMODE_PWM1;
      sConfigOC.Pulse = 500; // 设置占空比为50%
      sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
      sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
      HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_1);
      HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
      HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_2);
      HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_2);
    }
    
    void TIM3_Config(void)
    {
      TIM_IC_InitTypeDef sConfigIC;
    
      // 初始化TIM3外设时钟
      __HAL_RCC_TIM3_CLK_ENABLE();
    
      // 配置TIM3基本定时器参数
      htim3.Instance = TIM3;
      htim3.Init.Prescaler = 0; // 不分频
      htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim3.Init.Period = 65535; // 设置计数器的最大值
      htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
      HAL_TIM_Base_Init(&htim3);
    
      // 启动TIM3基本定时器
      HAL_TIM_Base_Start(&htim3);
    
      // 配置TIM3通道3和4为输入捕获模式
      sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING;
      sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
      sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
      sConfigIC.ICFilter = 0;
      HAL_TIM_IC_ConfigChannel(&htim3, &sConfigIC, TIM_CHANNEL_3);
      HAL_TIM_IC_ConfigChannel(&htim3, &sConfigIC, TIM_CHANNEL_4);
    
      // 启动TIM3通道3和4的输入捕获
      HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_3);
      HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_4);
    }
    
    int main(void)
    {
      // 初始化HAL库
      HAL_Init();
    
      // 配置TIM8和TIM3
      TIM8_Config();
      TIM3_Config();
    
      // 进入主循环
      while (1)
      {
        // 在这里执行其他任务
      }
    }
    
    // TIM3通道3的输入捕获回调函数
    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    {
      if (htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
      {
        uint32_t pulseValue = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3); // 读取捕获到的脉冲计数值
        float dutyCycle = (float)pulseValue / htim->Instance->ARR; // 计算占空比
        // 执行其他操作,比如将占空比打印出来
      }
    }
    
    // TIM3通道4的输入捕获回调函数
    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    {
      if (htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)
      {
        uint32_t pulseValue = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_4); // 读取捕获到的脉冲计数值
        float dutyCycle = (float)pulseValue / htim->Instance->ARR; // 计算占空比
        // 执行其他操作,比如将占空比打印出来
      }
    }
    

    这是一个使用HAL库的例子,通过TIM8生成4路PWM信号,然后使用TIM3的CH3和CH4通道来捕获这些PWM信号的占空比。你可以在HAL_TIM_IC_CaptureCallback回调函数中处理获得的占空比数据。请注意,以上示例代码只是指导,具体实现可能需要根据实际情况来调整。

    我希望以上信息对您有所帮助,如果有任何进一步的问题,请随时提问。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月27日
  • 已采纳回答 12月19日
  • 创建了问题 12月7日

悬赏问题

  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆
  • ¥15 arbotix没有/cmd_vel话题
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀
  • ¥50 我在一个购物网站的排队系统排队,这个排队到号后重新定向到目标网站进行购物,但是有技术牛通过技术方法直接跳过排队系统进入目标网址购物,有没有什么软件或者脚本可以用
  • ¥15 ios可以实现ymodem-1k协议 1024字节传输吗?