PWM舵机驱动求助

2019-07-21 04:30发布

各位大神好,我自己买了块F1的板子,写了个舵机驱动程序,用TIM2的CH1(IO口是PA0)输出,但是程序烧进去没有反应,求帮助啊
定时器程序如下
void TIM2_PWM_Init(u16 arr,u16 psc)
{  
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->B5   

   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO

   //初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

//初始化TIM3 Channel2 PWM模式  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC2Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

TIM_Cmd(TIM2, ENABLE);  //使能TIM3

}

下面是主程序:
int main(void)
{  
delay_init();       //延时函数初始化   
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200);  //串口初始化为115200
  LED_Init();        //LED端口初始化
  TIM2_PWM_Init(199,7199);  //不分频。PWM频率=72000000/900=80Khz
    while(1)
{
   TIM_SetCompare1(TIM2,5);
        delay_ms(1000);
  TIM_SetCompare1(TIM2,10);
        delay_ms(1000);
        TIM_SetCompare1(TIM2,15);
        delay_ms(1000);
        TIM_SetCompare1(TIM2,20);
        delay_ms(1000);
        TIM_SetCompare1(TIM2,25);
        delay_ms(1000);
        TIM_SetCompare1(TIM2,20);
        delay_ms(1000);
        TIM_SetCompare1(TIM2,15);
        delay_ms(1000);
        TIM_SetCompare1(TIM2,10);
        delay_ms(1000);     
  
}  
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
cyz
1楼-- · 2019-07-21 06:04
舵机的控制频率在50Hz到200Hz之间,80KHZ的频率舵机肯定没反应呀
q546163199
2楼-- · 2019-07-21 07:50
 精彩回答 2  元偷偷看……
puxing
3楼-- · 2019-07-21 08:16
谢谢回答!
LED灯的建议想过,但是买的是那种飞控板,店家的LED灯只是提示电源的,没有IO口;至于延时函数初始化时钟的问题,F1的延时函数是不含参数的。
我主要是怕程序有问题,但是检查好几遍了
向蓝
4楼-- · 2019-07-21 12:00
cyz 发表于 2016-3-10 14:28
**** 作者被禁止或删除 内容自动屏蔽 ****

他是修改的例程,注释是错的,199+1  *7199+1
向蓝
5楼-- · 2019-07-21 16:30
范围改为185-195之间,或者把极性取反
向蓝
6楼-- · 2019-07-21 18:37
int main(void)
{               
        u16 led0pwmval=0;
        u8 dir=1;       
        delay_init();                      
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        
        uart_init(115200);         
        LED_Init();               
TIM3_Int_Init(199,7199);         
        TIM3_PWM_Init();       
           while(1)
        {
                delay_ms(10);         
                if(dir)led0pwmval++;
                else led0pwmval--;

                if(led0pwmval>300)dir=0;
                if(led0pwmval==0)dir=1;                                                                                 
                TIM_SetCompare2(TIM3,192);                   //·¶Î§¿ØÖÆÔú175-195
        }         
}
试了好久

一周热门 更多>