野火电子论坛

 找回密码
 注册

扫一扫,访问微社区

查看: 817|回复: 6

[F1-指南者] 一个关于定时器PWM驱动舵机的问题。

[复制链接]
发表于 2019-1-10 21:15:53 | 显示全部楼层 |阅读模式
舵机型号是SG90 。 控制的方法是给一个周期20ms的PWM信号,高电平时间为0.5ms~2.5ms变化,舵机能输出不同的角度。可是为什么我的代码烧写进去以后舵机不工作呢?调了一下午了也没找到原因。 代码贴一下,请各位帮忙看看。
void GPIO_Config(void)
{
        GPIO_InitTypeDef Instruct;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        Instruct.GPIO_Mode=GPIO_Mode_AF_PP;
        Instruct.GPIO_Pin=GPIO_Pin_8;
        Instruct.GPIO_Speed=GPIO_Speed_10MHz;
        GPIO_Init(GPIOA,&Instruct);
}  //用的高级定时器I的通道1 指南者是PA8

void Advanced_Timer_Config(void)
{
        TIM_TimeBaseInitTypeDef BaseInstruct;
        TIM_OCInitTypeDef OcInstruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
        BaseInstruct.TIM_CounterMode=TIM_CounterMode_Up;
        BaseInstruct.TIM_Period=19999;                    //ARR=19999, fpwm=72MHZ/(PSC(71)+1)(ARR(19999)+1)=50HZ Tpwm=20ms
        BaseInstruct.TIM_Prescaler=71;      //PSC=71
        TIM_TimeBaseInit(TIM1,&BaseInstruct);

        OcInstruct.TIM_OCMode=TIM_OCMode_PWM1;   
        OcInstruct.TIM_OCPolarity=TIM_OCPolarity_High;
        OcInstruct.TIM_OutputState=TIM_OutputState_Enable;
        OcInstruct.TIM_Pulse=1000;   //CCR=1000 ,高电平时间为1ms
        TIM_OC1Init(TIM1,&OcInstruct);
        TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);//使能重装载
        TIM_ARRPreloadConfig(TIM1,ENABLE);   //使能重装载
        TIM_CtrlPWMOutputs(TIM1,ENABLE); //用高级定时器时打开这个
        TIM_Cmd(TIM1,ENABLE);
}

int main(){
       
        GPIO_Config();
        Advanced_Timer_Config();
        while(1);
}
按照网上的说法也不断修改了主函数里面的内容 比如说写成这样
int main(){
       
        GPIO_Config();
        Advanced_Timer_Config();
        TIM_SetCompare1(TIM1,1500);
        delay();
        TIM_SetCompare1(TIM1,2000);
        delay();
        while(1);
}
仍然不起作用。 请问到底是哪里出了问题呢?
回复

使用道具 举报

 楼主| 发表于 2019-1-10 22:35:15 | 显示全部楼层
就算他只转一下不转了,也应该在开始会转一个角度吧?
而且软件调试里面用示波器看PA8这个脚出来的PWM信号也是标准的PWM信号,为啥舵机就是毫无反应呢。。。
还有一点。就是按照ARR里面的值我装19999。那么PWM一个周期只有14MS左右,离计算的20MS有很多差距啊。把ARR值改成30000才大概在20MS左右。这是什么原因呢?
回复 支持 反对

使用道具 举报

发表于 2019-1-11 11:03:28 | 显示全部楼层
确认线接对了吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-11 12:58:29 | 显示全部楼层

线没问题。我怀疑是舵机的问题 昨天又从淘宝上买了一个 等到了看看。
现在还有个问题就是定时的问题,理论上算的是20MS 但是模拟示波器测的是13MS。不知道这个问题出在哪里。
回复 支持 反对

使用道具 举报

发表于 2019-1-11 15:16:24 | 显示全部楼层
KawhiL 发表于 2019-1-11 12:58
线没问题。我怀疑是舵机的问题 昨天又从淘宝上买了一个 等到了看看。
现在还有个问题就是定时的问题,理 ...

高级定时器不是还有个分频系数嘛。。。好像你这没有设置
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-11 23:51:59 | 显示全部楼层
非谢家之宝树 发表于 2019-1-11 15:16
高级定时器不是还有个分频系数嘛。。。好像你这没有设置

能具体地说说是哪个吗?
如果你是指BaseInit里面的 TIM_ClockDivision 这个如果选择不分频的话 还是72MHZ 我加上这句还是没变化。
还有这个结构体里面的TIM_RepetitionCounter 这个高级定时器必须要配置的这个。不管我配0还是0xff还是别的什么值依然不起作用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-12 23:38:55 | 显示全部楼层
非谢家之宝树 发表于 2019-1-11 15:16
高级定时器不是还有个分频系数嘛。。。好像你这没有设置

你说的是 BaseInitTypeDef里面的TIM_ClockDivision和TIM_RepetitionCounter吗?
这两个都设置了仍然不起作用。
回复 支持 反对

使用道具 举报

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

本版积分规则

野火电子公众号

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

GMT+8, 2019-3-25 22:46 , Processed in 0.540311 second(s), 30 queries , Gzip On.

野火电子论坛

© 2014-2016 www.firebbs.cn

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