OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4384|回复: 4

最近用STM32F103VCT6的定时器3输出PWM控制几个舵机,单独控制可以,为什么两个以上就乱转了

[复制链接]

9

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2016-9-16
在线时间
51 小时
发表于 2016-10-17 11:01:44 | 显示全部楼层 |阅读模式
3金钱
void TIM3_PWM4_Init3(u16 state)//一号舵机
{  
        static u16 i=200;
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //ê1Äü¶¨ê±Æ÷3ê±Öó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //ê1ÄüGPIOíaéèoíAFIO¸′óÃ1|ÄüÄ£¿éê±Öó
       
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer32¿íêè«ÖØó3éä  TIM3_CH4->B1   

   //éèÖøÃòy½ÅÎa¸′óÃêä3ö1|Äü,êä3öTIM3 CH4μ&#196WMÂö3å2¨DΠ       GPIOB.0
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM_CH3
        {GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; } //¸′óÃíÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//3õê¼»ˉGPIO

   //3õê¼»ˉTIM3
        TIM_TimeBaseStructure.TIM_Period = 1999; //éèÖÃÔúÏÂò»¸ö¸üDÂê¼t×°èë»î¶ˉμÄ×Ô¶ˉÖØ×°ÔؼÄ′æÆ÷ÖüÆúμÄÖμ
        TIM_TimeBaseStructure.TIM_Prescaler = 719; //éèÖÃóÃà′×÷ÎaTIMxê±ÖóÆμÂê3yêyμÄÔ¤·ÖÆμÖμ
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòéϼÆêyÄ£ê½
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ

        //3õê¼»ˉTIM3 Channel 3 PWMģ꽠        
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨ê±Æ÷Ä£ê½:TIMÂö3å¿í¶èμ÷ÖÆÄ£ê½2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è½Ïêä3öê1Äü
        TIM_OCInitStructure.TIM_Pulse = 18;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //êä3ö¼«DÔ:TIMêä3ö±è½Ï¼«DÔ¸ß
        TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //¸ù¾YTÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèTIM3 OC4
        TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);  //ê1ÄüTIM3ÔúCCR2éÏμÄԤװÔؼÄ′æÆ÷
        TIM_Cmd(TIM3, ENABLE);  //ê1ÄüTIM3

        if(state == 1)       //Æe
        {
                for(;i>140;i--)
                {
                        TIM_SetCompare4(TIM3,i);
                        delay_ms(20);
                }
        }
        else
        {
                for(;i<200;i++)
                {
                        TIM_SetCompare4(TIM3,i);
                        delay_ms(20);
                }
        }  //&#194;&#228;
}


void TIM3_PWM3_Init2(u16 state)//二号舵机
{  
        static u16 i=160;
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //ê1&#196;ü&#182;¨ê±&#198;÷3ê±&#214;ó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //ê1&#196;üGPIOíaéèoíAFIO&#184;′ó&#195;1|&#196;ü&#196;£&#191;éê±&#214;ó
       
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer22&#191;íêè&#171;&#214;&#216;ó3é&#228;  TIM3_CH3->B0   

   //éè&#214;&#195;&#184;&#195;òy&#189;&#197;&#206;a&#184;′ó&#195;ê&#228;3&#246;1|&#196;ü,ê&#228;3&#246;TIM3 CH4μ&#196WM&#194;&#246;3&#229;2¨D&#206;        GPIOB.0
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM_CH3
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //&#184;′ó&#195;í&#198;íìê&#228;3&#246;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉGPIO

   //3&#245;ê&#188;&#187;ˉTIM3
        TIM_TimeBaseStructure.TIM_Period = 1999; //éè&#214;&#195;&#212;ú&#207;&#194;ò&#187;&#184;&#246;&#184;üD&#194;ê&#194;&#188;t×°è&#235;&#187;&#238;&#182;ˉμ&#196;×&#212;&#182;ˉ&#214;&#216;×°&#212;&#216;&#188;&#196;′&#230;&#198;÷&#214;ü&#198;úμ&#196;&#214;μ
        TIM_TimeBaseStructure.TIM_Prescaler = 719; //éè&#214;&#195;ó&#195;à′×÷&#206;aTIMxê±&#214;ó&#198;μ&#194;ê3yêyμ&#196;&#212;¤·&#214;&#198;μ&#214;μ
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éè&#214;&#195;ê±&#214;ó·&#214;&#184;&#238;:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM&#207;òé&#207;&#188;&#198;êy&#196;£ê&#189;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //&#184;ù&#190;YTIM_TimeBaseInitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉTIMxμ&#196;ê±&#188;&#228;&#187;ùêyμ¥&#206;&#187;

        //3&#245;ê&#188;&#187;ˉTIM3 Channel3 PWM&#196;£ê&#189;         
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //&#209;&#161;&#212;&#241;&#182;¨ê±&#198;÷&#196;£ê&#189;:TIM&#194;&#246;3&#229;&#191;í&#182;èμ÷&#214;&#198;&#196;£ê&#189;2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è&#189;&#207;ê&#228;3&#246;ê1&#196;ü
        TIM_OCInitStructure.TIM_Pulse = 180;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //ê&#228;3&#246;&#188;&#171;D&#212;:TIMê&#228;3&#246;±è&#189;&#207;&#188;&#171;D&#212;&#184;&#223;
        TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //&#184;ù&#190;YT&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèTIM3 OC3
        TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  //ê1&#196;üTIM3&#212;úCCR2é&#207;μ&#196;&#212;¤×°&#212;&#216;&#188;&#196;′&#230;&#198;÷
        TIM_Cmd(TIM3, ENABLE);  //ê1&#196;üTIM3
       
        if(state == 1)       //&#198;e
        {
                for(;i>130;i--)
                {
                        TIM_SetCompare3(TIM3,i);
                        delay_ms(30);
                }
               
        }
        else
        {
                for(;i<190;i++)
                {
                        TIM_SetCompare3(TIM3,i);
                        delay_ms(30);
                }
        }  
}


int main(void)
{       
RCC_Configuration();
delay_init();                      
uart_init(115200);

TIM3_PWM3_Init2(1);//二号舵机
        delay_ms(1000);
TIM3_PWM4_Init3(1);//一号舵机

while(1);

}


最佳答案

查看完整内容[请看2#楼]

1,把所有舵机拔了,用示波器打波形,如果正确,到第2步 2,舵机需要的电流比较大,如果大电流反向影响到控制引脚,也可能会乱,这时,将所有地线全部接回电源供电端
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-10-5
在线时间
24 小时
发表于 2016-10-17 11:01:45 | 显示全部楼层
1,把所有舵机拔了,用示波器打波形,如果正确,到第2步
2,舵机需要的电流比较大,如果大电流反向影响到控制引脚,也可能会乱,这时,将所有地线全部接回电源供电端
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-10-18 21:34:59 | 显示全部楼层
看波形分析问题。
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-9-29
在线时间
1 小时
发表于 2016-11-23 17:27:24 | 显示全部楼层
666656666
回复

使用道具 举报

8

主题

45

帖子

0

精华

高级会员

Rank: 4

积分
548
金钱
548
注册时间
2015-1-18
在线时间
173 小时
发表于 2016-11-24 09:11:29 | 显示全部楼层
很有可能是输出电流不够 ,舵机的电流需要比较大
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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