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