OpenEdv-开源电子网

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

大佬们求助 自己写了飞控程序 但电机转不起来

[复制链接]

48

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
240
金钱
240
注册时间
2018-4-21
在线时间
105 小时
发表于 2018-4-21 16:06:23 | 显示全部楼层 |阅读模式
1金钱
void esc_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

TIM_TimeBaseInitStructure.TIM_Period=2499;
TIM_TimeBaseInitStructure.TIM_Prescaler=83;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Init(GPIOB,&GPIO_InitStructure);

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=1000;
TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;

TIM_OC1Init(TIM4,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);

TIM_OC2Init(TIM4,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);

TIM_OC3Init(TIM4,&TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);

TIM_OC4Init(TIM4,&TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);

TIM_Cmd(TIM4,ENABLE);

delay_init(168);
TIM_SetCompare1(TIM4,2000);
TIM_SetCompare2(TIM4,2000);
TIM_SetCompare3(TIM4,2000);
TIM_SetCompare4(TIM4,2000);
  delay_ms(1000);
delay_ms(1000);
delay_ms(1000);

TIM_SetCompare1(TIM4,1000);
TIM_SetCompare2(TIM4,1000);
TIM_SetCompare3(TIM4,1000);
TIM_SetCompare4(TIM4,1000);

delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
}这个是电调的程序

int main(void)
{
IIC_Init();
timer_init();
esc_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

TIM_SetCompare1(TIM4,1000);
TIM_SetCompare2(TIM4,1000);
TIM_SetCompare3(TIM4,1000);
TIM_SetCompare4(TIM4,1000);
delay_ms(1000);
delay_ms(1000);

while(1)
{
  TIM_SetCompare1(TIM4,1500);
   TIM_SetCompare2(TIM4,1500);
   TIM_SetCompare3(TIM4,1500);
   TIM_SetCompare4(TIM4,1500);
}
}这个是主函数
飞控还不完整 但我只想让电机转起来看看效果 但不知道这代码哪里出问题了 通电以后电机就响一声然后抖一下就没了
电调用的是新西达30A的电调 有大佬知道问题所在吗

最佳答案

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

//*************************************************** //TIM4用于PWM控制马达 //arr:自动重装值 //psc:时钟预分频数 //*************************************************** void TIM4_Init(uint16_t arr,uint16_t psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // NVIC_InitTypeDef NV ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2014-6-26
在线时间
74 小时
发表于 2018-4-21 16:06:24 | 显示全部楼层
本帖最后由 国行者 于 2018-4-23 10:57 编辑

//***************************************************
//TIM4用于PWM控制马达
//arr:自动重装值
//psc:时钟预分频数
//***************************************************
void TIM4_Init(uint16_t arr,uint16_t psc)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
//        NVIC_InitTypeDef NVIC_InitStructure;
        
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode        = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed        =        GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType        =        GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd        =        GPIO_PuPd_UP;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM4);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_TIM4);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_TIM4);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_TIM4);
        
        TIM_TimeBaseStructure.TIM_Prescaler     = psc;
        TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;//向上计数
        TIM_TimeBaseStructure.TIM_Period        = arr;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
        
        TIM_OCInitStructure.TIM_OCMode       = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState  = TIM_OutputState_Enable;//比较输出使能
        TIM_OCInitStructure.TIM_Pulse        = 0;                     //初始有效电平比例为0
        TIM_OCInitStructure.TIM_OCPolarity   = TIM_OCPolarity_High;   //高电平为有效电平
        TIM_OC1Init(TIM4,&TIM_OCInitStructure);
        TIM_OC2Init(TIM4,&TIM_OCInitStructure);
        TIM_OC3Init(TIM4,&TIM_OCInitStructure);
        TIM_OC4Init(TIM4,&TIM_OCInitStructure);
        
        TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
        TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);
        TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);
        TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);
        
        TIM_Cmd(TIM4,ENABLE);
        
        Moto_PWM(0,0,0,0);
}

//*************************************************
//马达转速控制程序
//*************************************************
void Moto_PWM(int16_t MOTO1_PWM,int16_t MOTO2_PWM,int16_t MOTO3_PWM,int16_t MOTO4_PWM)
{
        if(MOTO1_PWM>999) MOTO1_PWM=999;
        if(MOTO2_PWM>999)        MOTO2_PWM=999;
        if(MOTO3_PWM>999)        MOTO3_PWM=999;
        if(MOTO4_PWM>999)        MOTO4_PWM=999;
        
        if(MOTO1_PWM<0)        MOTO1_PWM=0;
        if(MOTO2_PWM<0)        MOTO2_PWM=0;
        if(MOTO3_PWM<0)        MOTO3_PWM=0;
        if(MOTO4_PWM<0)        MOTO4_PWM=0;
        
        //4个PWM通道
        TIM4->CCR1=MOTO1_PWM;
        TIM4->CCR2=MOTO2_PWM;
        TIM4->CCR3=MOTO3_PWM;
        TIM4->CCR4=MOTO4_PWM;
}

这是我从我程序里复制出来的初始化程序,是没有问题的。这里我没开时钟是因为我在我其它地方开了,就不贴出来了。
回复

使用道具 举报

48

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
240
金钱
240
注册时间
2018-4-21
在线时间
105 小时
 楼主| 发表于 2018-4-21 16:06:50 | 显示全部楼层
在线等 急急急
回复

使用道具 举报

48

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
240
金钱
240
注册时间
2018-4-21
在线时间
105 小时
 楼主| 发表于 2018-4-21 19:30:09 | 显示全部楼层
大家别光看啊 说说看法嘛
回复

使用道具 举报

2

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2014-6-26
在线时间
74 小时
发表于 2018-4-21 22:43:01 | 显示全部楼层
GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_TIM4);
回复

使用道具 举报

2

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2014-6-26
在线时间
74 小时
发表于 2018-4-21 22:50:45 | 显示全部楼层
你用逻辑分析仪抓一下,你这个估计PWM都没发出来吧。
市场上的电调一般都是20ms的PWM周期,1-2毫秒的高电平控制对应电机的0转到满转。差多了就不行。
回复

使用道具 举报

48

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
240
金钱
240
注册时间
2018-4-21
在线时间
105 小时
 楼主| 发表于 2018-4-22 11:30:45 | 显示全部楼层
国行者 发表于 2018-4-21 22:50
你用逻辑分析仪抓一下,你这个估计PWM都没发出来吧。
市场上的电调一般都是20ms的PWM周期,1-2毫秒的高电 ...

确实 没有波形出来 但这个问题出在哪里啊 我已经调成50HZ的频率了
回复

使用道具 举报

2

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2014-6-26
在线时间
74 小时
发表于 2018-4-22 22:01:33 | 显示全部楼层
c627933142 发表于 2018-4-22 11:30
确实 没有波形出来 但这个问题出在哪里啊 我已经调成50HZ的频率了

你加上我上面发的那四行试试,那几行也是必须的。
回复

使用道具 举报

2

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2014-6-26
在线时间
74 小时
发表于 2018-4-22 22:05:56 | 显示全部楼层
本帖最后由 国行者 于 2018-4-22 22:07 编辑

TIM4_Init(999,0);   //0不分频,则每(1/80)us计1次数,最大计时到12.5us,即PWM的周期为12.5us,频率为80KHz
我控制的是空心杯电机,你用电调的话,改一下重装值和预分频值。
回复

使用道具 举报

48

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
240
金钱
240
注册时间
2018-4-21
在线时间
105 小时
 楼主| 发表于 2018-4-24 19:47:42 | 显示全部楼层
国行者 发表于 2018-4-22 22:05
TIM4_Init(999,0);   //0不分频,则每(1/80)us计1次数,最大计时到12.5us,即PWM的周期为12.5us,频率为8 ...

全换成了你的代码 用的是定时器1和PA8,9,10,11四个口 只有一个电机隔一秒动一下 其他三个没反应
回复

使用道具 举报

2

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2014-6-26
在线时间
74 小时
发表于 2018-4-24 21:43:34 | 显示全部楼层
c627933142 发表于 2018-4-24 19:47
全换成了你的代码 用的是定时器1和PA8,9,10,11四个口 只有一个电机隔一秒动一下 其他三个没反应

QQ截图20180424214331.jpg
回复

使用道具 举报

48

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
240
金钱
240
注册时间
2018-4-21
在线时间
105 小时
 楼主| 发表于 2018-4-25 19:27:18 | 显示全部楼层

这个moto-pwm可以在主函数里直接用吗?
还有个问题  mpu6050的程序可以直接套在mpu9250上面吗?
回复

使用道具 举报

2

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2014-6-26
在线时间
74 小时
发表于 2018-4-25 21:14:34 | 显示全部楼层
本帖最后由 国行者 于 2018-4-25 21:18 编辑
c627933142 发表于 2018-4-25 19:27
这个moto-pwm可以在主函数里直接用吗?
还有个问题  mpu6050的程序可以直接套在mpu9250上面吗?

可以直接用,你控制电调的话要改一改,我只是贴出来给你参考一下。其实跟你程序里四个TIM_SetCompare1(TIM4,1500)一样的功能,只不过我直接控制寄存器的。

你要是用I2C的话,两块芯片代码基本上可以直接套用,不过他们的芯片ID不一样,就是芯片手册里的WHO_AM_I寄存器,其它寄存器应该都一样的,具体还要看手册,我没仔细对比过。
要是SPI的话,那就不能套用了,mpu6050是不支持SPI的。
回复

使用道具 举报

48

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
240
金钱
240
注册时间
2018-4-21
在线时间
105 小时
 楼主| 发表于 2018-4-27 15:34:02 | 显示全部楼层
感谢大佬解答
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 03:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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