congmingbing 2022-03-10 10:54 采纳率: 100%
浏览 71
已结题

大四毕业生STM32nucleof103使用PWM驱动舵机找相应管脚,怎么学习看手册啊,小白菜菜,大lao捞捞

大四毕设,初学32.我想用 STM32nucleof103rb开发板驱动舵机,配置过程出现问题,程序下进去之后舵机一动不动,我怀疑我在程序中使用的管脚不可以使用PWM信号,就去看手册,结果从来没看过手册懵住了看不懂。具体是手册上对于管脚的介绍看不懂,不明白它设置ARduino的管脚,这些管脚是不是也可以直接用32的程序驱动,我想知道哪些是用于32使用pwm的管脚呀,有没有大lao教教看手册,告诉我一下这块开发板上哪些是用于32使用pwm的管脚呀 我用的是D10,主要是看她上面有写PWM,所用程序如下 (程序可正常运行)
技术手册:https://os.mbed.com/platforms/ST-Nucleo-F103RB/

img

img

img

#include "stm32f10x.h" // Device header

/先使用TIM1的通道1/
#define GENERAL_TIM TIM3
#define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
#define GENERAL_TIM_CLK RCC_APB1Periph_TIM3
//配置预分频寄存器PSC的值为(7200-1),内部时钟为72MHz,则计数一次的时间为(7200/72000000)s=0.1ms;
#define GENERAL_TIM_Prescaler (72000-1)
//配置自动装载寄存器ARR的值为(200-1),那么产生一次计数中断的周期为20ms,与驱动舵机需要的周期相符
#define GENERAL_TIM_Period (20-1)

// TIM3 输出比较通道1
#define GENERAL_TIM_CH1_GPIO_CLK RCC_APB2Periph_GPIOB
#define GENERAL_TIM_CH1_PORT GPIOB
#define GENERAL_TIM_CH1_PIN GPIO_Pin_6
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);
}

//使用TIM功能的PWM模式
static void GENERAL_TIM_Mode_Config(void)
{
// 开启定时器时钟,即内部时钟CK_INT=72M
GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);

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);

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 = 0;
TIM_OC1Init(GENERAL_TIM, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);

    // 使能计数器
TIM_Cmd(GENERAL_TIM, ENABLE);

}

//定义一个初始化函数,同时初始化时基与输出比较
void GENERAL_TIM_Init(void)
{
GENERAL_TIM_GPIO_Config();
GENERAL_TIM_Mode_Config();
}
void Delay(__IO uint32_t nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
}

#define SOFT_DELAY Delay(0x011111); 文中不让连续输入F,所以用1代替F
int main(void)
{
GENERAL_TIM_Init();

while(1)
{
    for(int i = 5;i < 26;i++)//结果测试,设置CCR的值为5-6对应舵机旋转到0°-180°
    {
        TIM_SetCompare1(GENERAL_TIM , i);
        SOFT_DELAY;
    }
}

}

  • 写回答

1条回答 默认 最新

  • EXstar 2022-03-10 16:21
    关注

    给你点看手册的建议吧,PWM这个功能是通用定时器的(高级定时器也有,但是死区那个功能你暂时用不到),首先要去手册里面找有通用定时的引脚去开启定时器功能,然后开启PWM功能。
    其次你这舵机不动,可能原因一是舵机硬件没通上电,二的话你要看程序里面PWM设置的装载值,比较值这些,是程序写死的还是说可以通过按键来进行改变的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月7日
  • 已采纳回答 3月30日
  • 创建了问题 3月10日

悬赏问题

  • ¥15 qt+ffmpeg报错non-existing PPS 0 referenced
  • ¥15 FOC simulink
  • ¥15 咨询一下有关于王者荣耀赢藏战绩
  • ¥50 MacOS 使用虚拟机安装k8s
  • ¥500 亚马逊 COOKIE我如何才能实现 登录一个亚马逊账户 下发新 COOKIE ..我使用下发新COOKIE 导入ADS 指纹浏览器登录,我把账户密码 修改过后,原来下发新COOKIE 不会失效的方式
  • ¥20 玩游戏gpu和cpu利用率特别低,玩游戏卡顿
  • ¥25 oracle中的正则匹配
  • ¥15 关于#vscode#的问题:把软件卸载不会再出现蓝屏
  • ¥15 vimplus出现的错误
  • ¥30 怎么使用AVL fire ESE软件自带的优化模式来优化设计Soot和NOx?