野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18797|回复: 1

f103 c6t6输出pwm波的频率与占空比问题

[复制链接]
发表于 2021-7-29 23:49:39 | 显示全部楼层 |阅读模式
用的是c6t6的最小系统板,定时器TIM2的通道1和2,在PA0和PA1输出pwm波,定时器的配置照搬火哥的高级定时器--pwm输入捕获的历程,根据c6t6的引脚定义自己修改了一下对应的引脚,但是测试发现pwm确实能从PA0和PA1输出,减速电机也能在l298n的驱动下转,但是无论怎么改变占空比都不能使得电机的速度降下来,除非将占空比调到5%以下,可是速度 还是 太快了,再降低占空比电机就不转了,求有经验的大佬帮忙看一下问题出在哪里
定时器c文件:
#include "bsp_GeneralTim.h"

static void GENERAL_TIM_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  // 输出比较通道1 GPIO 初始化
        RCC_APB2PeriphClockCmd(GENERAL_TIM_CH1_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  GENERAL_TIM_CH1_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GENERAL_TIM_CH1_PORT, &GPIO_InitStructure);
       
        // 输出比较通道2 GPIO 初始化
        RCC_APB2PeriphClockCmd(GENERAL_TIM_CH2_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  GENERAL_TIM_CH2_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GENERAL_TIM_CH2_PORT, &GPIO_InitStructure);
        野火论坛202107292339257907..png
}




static void GENERAL_TIM_Mode_Config(void)
{
  // 开启定时器时钟,即内部时钟CK_INT=72M
        GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);

/*--------------------时基结构体初始化-------------------------*/
        // 配置周期,这里配置为1K
       
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
        TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;       
        // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
        TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler;       
        // 时钟分频因子 ,配置死区时间时需要用到
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               
        // 计数器计数模式,设置为向上计数
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;               
        // 重复计数器的值,没用到不用管
        TIM_TimeBaseStructure.TIM_RepetitionCounter=0;       
        // 初始化定时器
        TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);

        /*--------------------输出比较结构体初始化-------------------*/       
        // 占空比配置
        uint16_t CCR1_Val = 500;
        uint16_t CCR2_Val = 500;
       
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        // 配置为PWM模式1
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        // 输出使能
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        // 输出通道电平极性配置       
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
       
        // 输出比较通道 1
        TIM_OCInitStructure.TIM_Pulse = CCR1_Val;                                                                                                //即占空比为50/(99+1)=50%
        TIM_OC1Init(GENERAL_TIM, &TIM_OCInitStructure);
        TIM_OC1PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
       
        // 输出比较通道 2
        TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
        TIM_OC2Init(GENERAL_TIM, &TIM_OCInitStructure);
        TIM_OC2PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);       
        // 使能计数器
        TIM_Cmd(GENERAL_TIM, ENABLE);
}

void GENERAL_TIM_Init(void)
{
        GENERAL_TIM_GPIO_Config();
        GENERAL_TIM_Mode_Config();               
}



头文件 :

#ifndef __BSP_GENERALTIME_H
#define __BSP_GENERALTIME_H


#include "stm32f10x.h"


/************通用定时器TIM参数定义,只限TIM2、3、4、5************/

#define            GENERAL_TIM                   TIM2                                                                                               
#define            GENERAL_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
#define            GENERAL_TIM_CLK               RCC_APB1Periph_TIM2        
#define            GENERAL_TIM_Period            999                                //即式中的ARR
#define            GENERAL_TIM_Prescaler         71                                //即式中的PSC,经计算得出该频率为1k
// TIM3 输出比较通道1
#define            GENERAL_TIM_CH1_GPIO_CLK      RCC_APB2Periph_GPIOA
#define            GENERAL_TIM_CH1_PORT          GPIOA
#define            GENERAL_TIM_CH1_PIN           GPIO_Pin_0

// TIM3 输出比较通道2
#define            GENERAL_TIM_CH2_GPIO_CLK      RCC_APB2Periph_GPIOA
#define            GENERAL_TIM_CH2_PORT          GPIOA
#define            GENERAL_TIM_CH2_PIN           GPIO_Pin_1

/**************************函数声明********************************/

void GENERAL_TIM_Init(void);


#endif        /* __BSP_GENERALTIME_H */


回复

使用道具 举报

发表于 2021-7-30 10:20:26 | 显示全部楼层
修改CCR1_Val 的值来修改占空比, 我看你用的是GENERAL_TIM_Period    = 999,  而CCR1_Val =500, 就是1/2占空比
那么你直接修改关于CCR1_VAL的这个定时器的寄存器值就可以修改占空比了. 注意是修改寄存器,而不是修改CCR1_Val;
具体的代码 , 你找下我发的舵机程序 ,在it.c里面有一个TIM3->CCR1 = dat;, 这个就是代表修改占空比的意思
比如dat= 500,就是 500/(999+1) = 50%, 比如dat = 10 就是 10/1000 = 1% 接下来你应该懂的了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 14:32 , Processed in 0.027549 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表