鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    如何在stm32f103上输出占空比为50的tim

    已定时 已固定 已锁定 已移动
    机器人学
    stm32 占空比
    2
    4
    440
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 2
      2251752108
      最后由 编辑

      如何在stm32f103上输出占空比为50的tim
      用setcompare函数可以吗

      1 条回复 最后回复 回复 引用 0
      • 小伊小
        机器人小伊
        最后由 编辑

        在STM32F103微控制器上配置定时器(TIM)以输出占空比为50%的PWM信号是完全可行的。你可以使用STM32 HAL库来简化配置过程。HAL_TIM_PWM_Start 和 __HAL_TIM_SET_COMPARE 函数是设置和启动PWM信号的关键函数。

        以下是一个基本的步骤指南,说明如何配置TIM以输出占空比为50%的PWM信号:

        1. 初始化TIM定时器:配置TIM定时器的基本参数,如时钟源、预分频器、计数模式等。

        2. 配置PWM通道:设置PWM输出的GPIO引脚和通道,以及PWM模式(如边缘对齐或中心对齐)。

        3. 启动PWM:使用HAL库函数启动PWM输出。

        4. 设置比较值:使用__HAL_TIM_SET_COMPARE函数设置比较寄存器,以控制PWM的占空比。

        以下是一个简单的代码示例,假设我们使用TIM3和通道1(PA6引脚):

        #include "stm32f1xx_hal.h"
        
        TIM_HandleTypeDef htim3;
        
        void SystemClock_Config(void);
        static void MX_GPIO_Init(void);
        static void MX_TIM3_Init(void);
        
        int main(void)
        {
            HAL_Init();
            SystemClock_Config();
            MX_GPIO_Init();
            MX_TIM3_Init();
        
            // 启动PWM输出
            HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
        
            // 设置占空比为50%
            // 自动重装载寄存器(ARR)的值决定了PWM的频率
            // 假设ARR设置为1000,则比较值(CCR)应设置为500以达到50%占空比
            __HAL_TIM_SET_AUTORELOAD(&htim3, 1000 - 1);  // 计数到1000时溢出
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 500 - 1);  // 占空比为50%
        
            while (1)
            {
                // 主循环
            }
        }
        
        void SystemClock_Config(void)
        {
            // 系统时钟配置代码
        }
        
        static void MX_GPIO_Init(void)
        {
            // GPIO初始化代码,包括PA6引脚
            __HAL_RCC_GPIOA_CLK_ENABLE();
            GPIO_InitTypeDef GPIO_InitStruct = {0};
            GPIO_InitStruct.Pin = GPIO_PIN_6;
            GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
            GPIO_InitStruct.Pull = GPIO_NOPULL;
            GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
            GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;  // TIM3_CH1
            HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
        }
        
        static void MX_TIM3_Init(void)
        {
            __HAL_RCC_TIM3_CLK_ENABLE();
            htim3.Instance = TIM3;
            htim3.Init.Prescaler = 71;  // 假设系统时钟为72MHz,预分频器设置为71,得到1MHz的计数频率
            htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
            htim3.Init.Period = 0xFFFFFFFF;  // 初始化为最大值,稍后在代码中设置实际的ARR值
            htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
            htim3.Init.RepetitionCounter = 0;
            htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
            if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
            {
                // 初始化错误处理
                Error_Handler();
            }
        }
        
        void Error_Handler(void)
        {
            // 用户可以在此添加自己的错误处理代码
            while(1)
            {
            }
        }
        

        注意事项:

        1. 时钟配置:确保系统时钟配置正确,以计算适当的预分频器值。
        2. GPIO配置:确保PWM输出引脚配置正确,并且复用功能正确设置。
        3. 自动重装载寄存器(ARR):__HAL_TIM_SET_AUTORELOAD 函数设置ARR值,它决定了PWM信号的频率。
        4. 比较寄存器(CCR):__HAL_TIM_SET_COMPARE 函数设置CCR值,它决定了PWM信号的占空比。

        通过上述步骤和代码示例,你应该能够在STM32F103上成功配置和输出占空比为50%的PWM信号。


        以上为生成回答,仅供参考~

        我是小伊,已接入ChatGpt,所有回复,仅供参考~

        2 1 条回复 最后回复 回复 引用 0
        • 2
          2251752108 @小伊
          最后由 编辑

          @小伊 在 如何在stm32f103上输出占空比为50的tim 中说:

          __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 500 - 1);  // 占空比为50%
          

          这里为什么是500-1

          1 条回复 最后回复 回复 引用 0
          • 小伊小
            机器人小伊
            最后由 编辑

            在STM32的定时器(TIM)配置中,设置PWM(脉冲宽度调制)信号的占空比通常涉及到几个关键参数:自动重装载寄存器(ARR)、预分频器(PSC)和比较寄存器(CCR)。这里讨论的是如何通过设置比较寄存器(CCR)的值来控制占空比。

            首先,了解几个基本概念:

            • 自动重装载寄存器(ARR):定义了定时器计数器的最大值。当计数器达到这个值时,定时器会重新从0开始计数(或者根据配置可能保持当前值不变,具体取决于定时器的模式)。
            • 预分频器(PSC):用于减慢定时器的计数速度。定时器的实际计数频率是时钟频率除以(PSC+1)。
            • 比较寄存器(CCR):用于生成PWM输出。当定时器计数器的值小于或等于CCR的值时,PWM输出高电平;当计数器的值大于CCR的值时,输出低电平。

            假设定时器配置为向上计数模式,且ARR的值决定了PWM周期的长度。如果ARR被设置为1000(假设PSC为0,即没有预分频,定时器计数频率等于时钟频率),那么整个PWM周期的长度就是计数器从0计数到1000的时间。

            要生成50%的占空比,意味着高电平的时间应该等于低电平的时间。因此,在1000个计数单位中,高电平应该持续500个计数单位。这就是为什么在代码中你会看到:

            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 500 - 1);  // 占空比为50%
            

            这里的500 - 1是因为STM32的HAL库中,__HAL_TIM_SET_COMPARE函数实际上是将CCR的值设置为参数指定的值。但是,从占空比的概念出发,我们想要的是高电平占据半个周期,即500个计数单位。然而,由于计数是从0开始的,所以当计数达到500时(实际上是第501个计数),它已经超过了中间点,应该立即切换到低电平。因此,为了确保高电平正好持续500个计数单位,我们需要将CCR设置为499(即500-1),这样当计数达到500时,比较匹配发生,PWM输出切换到低电平。

            总结:设置500 - 1是为了确保在向上计数模式下,高电平正好持续半个周期(即500个计数单位),从而得到50%的占空比。


            以上为生成回答,仅供参考~

            我是小伊,已接入ChatGpt,所有回复,仅供参考~

            1 条回复 最后回复 回复 引用 0
            • 第一个帖子
              最后一个帖子
            皖ICP备16016415号-7
            Powered by NodeBB | 鱼香ROS