OpenEdv-开源电子网

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

小四轴电机转动后,2.4G模块就不通信了

[复制链接]

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-4-2
在线时间
8 小时
发表于 2018-4-17 11:38:02 | 显示全部楼层 |阅读模式
5金钱
小弟的毕设是用STM32F030做一个小四轴,这两天刚把硬件做完,准备调试程序,可是却碰到了一个怪问题,就是不接电机的时候,可以通过遥控器去控制四路PWM的占空比大小,可是一接上电机,电机转起来后,2.4G就不通信了,2.4G芯片我用的是NRF24L01,稳压芯片用的是AMS1117。求各路大神帮我分析下原因,万分感谢
我先说一下,我的几个思路,给各位抛砖引玉。
硬件问题  1、一开始,我怀疑是电池电压不足,就换了个充满电的电池,电池电压达4.2V,可是问题依旧。
              2、怕电池还是不能说明问题,我就找来了直流源,直接上5V,最大电流给到2A,当电机工作时,我去测各模块的电压,都能够维持在3.3V左右。甚至,我直接用电流源输出3.3V到2.4模块两端,可是问题还是存在。   
              3、布线可能有问题,这个不好验证,我准备一会儿用开发板连短线试一下。这个我上传图片,请大家帮我看一下,右侧双四脚直插封装是2.4G。
                                        电源部分.png                            电机驱动.png
                                           IMG_20180417_094722.jpg                          PCB.png
软件问题  硬件暂时没有找到问题,我就去想程序或许有问题。但是,在不接电机的时候,我通过示波器可以看到,遥控器的确是可以控制PWM的输出占空比的。而且在网上查,好多人说,把2.4G的自动应答关掉,我也关掉了,可是并没有起作用。
定时器配置代码,TIM3用来做定时,TIM1产生四路PWM
#include "time.h"

__IO uint16_t CCR3_Val = 60000;//定时10ms
__IO uint16_t CCR4_Val = 6000; //定时1ms
__IO uint16_t temp1=0;
__IO uint16_t temp2=0;

uint16_t PrescalerValue = 0;
uint16_t TimerPeriod = 0;
uint16_t Channel1Pulse = 0, Channel2Pulse = 0, Channel3Pulse = 0, Channel4Pulse = 0;
extern uint16_t motor_out1,motor_out2,motor_out3,motor_out4;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;

void TIM_INT_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
       
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
       
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

void TIM_OUT_Config(void)
{
       
  /* 计算预分频值 */
  PrescalerValue = (uint16_t) (SystemCoreClock  / 6000000) - 1;
       
  /* Time 定时器基础设置 */
  TIM_TimeBaseStructure.TIM_Period = 65535;
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  /* 预分频器配置 */
  TIM_PrescalerConfig(TIM3, PrescalerValue, TIM_PSCReloadMode_Immediate);

  /* 输出比较时序模式配置设置 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  /* 输出比较时序模式配置: 频道3*/
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);

  /* 输出比较时序模式配置: 频道4 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
  TIM_OC4Init(TIM3, &TIM_OCInitStructure);
  TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);

  /* TIM 中断使能 */
  TIM_ITConfig(TIM3, TIM_IT_CC3 | TIM_IT_CC4, ENABLE);

  /* TIM3 使能 */
  TIM_Cmd(TIM3, ENABLE);
               
}
void TIM_PWM_Config(void)
{
  TimerPeriod = (SystemCoreClock / 5000 ) - 1;   //20kHz
  Channel1Pulse = (uint16_t) (((uint32_t) motor_out1 * (TimerPeriod - 1)) / 200);//50%占空比
  Channel2Pulse = (uint16_t) (((uint32_t) motor_out2 * (TimerPeriod - 1)) / 200);
  Channel3Pulse = (uint16_t) (((uint32_t) motor_out3 * (TimerPeriod - 1)) / 200);
  Channel4Pulse = (uint16_t) (((uint32_t) motor_out4 * (TimerPeriod- 1)) / 200);
  /* TIM1 时钟使能 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);

  /* Time 定时基础设置*/
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  /* Time 定时设置为上升沿计算模式*/
  TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
       
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  /* 频道1,2,3,4的PWM 模式设置 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

  TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;//使能频道1配置
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);

  TIM_OCInitStructure.TIM_Pulse = Channel2Pulse;//使能频道2配置
  TIM_OC2Init(TIM1, &TIM_OCInitStructure);

  TIM_OCInitStructure.TIM_Pulse = Channel3Pulse;//使能频道3配置
  TIM_OC3Init(TIM1, &TIM_OCInitStructure);

  TIM_OCInitStructure.TIM_Pulse = Channel4Pulse;//使能频道4配置
  TIM_OC4Init(TIM1, &TIM_OCInitStructure);
       
  /* TIM1 计算器使能*/
  TIM_Cmd(TIM1, ENABLE);
       
  /* TIM1 主输出使能 */
  TIM_CtrlPWMOutputs(TIM1, ENABLE);       
        }

void TIM_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* 使能GPIO时钟 */
  RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);

  /* 配置GPIO管脚复用*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  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_DOWN ;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_2);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_2);

}
主函数代码,不带姿态反馈
void Init(void)
{
        SystemInit();
        Systick_Init();
        LED_Init();       
        KEY_Init();
        TIM_Config();
        TIM_INT_Config();
        TIM_OUT_Config();
        USART_Configuration();
        MPU_Init();
        sensorsBiasInit(&gyroBias);
        NRF24L01_Init();
}

/**********************************************/
/* 函数功能;主函数                           */
/* 入口参数:无                               */
/**********************************************/
int main(void)
{
        Init();
        Delay_ms(1000);       
        while(1)
        {                       
                while(NRF24L01_Check())
                {printf("NRF2401 ERROR\n");}
                NRF24L01_RX_Mode();
                while(1)
                {                
                        NRF24L01_RxPacket(temp_buf);
                        Start_Word=temp_buf[0];
                        j=countof(temp_buf)-1;
                        for(i=1;i<=j;i++)
                        {
                                At_expect_buf=temp_buf-51;
                                printf("%d: %d  ",i,At_expect_buf);
                        }               
                        printf("\n");       

               
                motor[0]=At_expect_buf[0] + 70 - At_expect_buf[1] + At_expect_buf[2] - At_expect_buf[3];
                motor[1]=At_expect_buf[0] + 70 - At_expect_buf[1] - At_expect_buf[2] + At_expect_buf[3];
                motor[2]=At_expect_buf[0] + 70 + At_expect_buf[1] + At_expect_buf[2] + At_expect_buf[3];
                motor[3]=At_expect_buf[0] + 70 + At_expect_buf[1] - At_expect_buf[2] - At_expect_buf[3];
               
                motor_out1=motor[0];
                motor_out2=motor[1];
                motor_out3=motor[2];
                motor_out4=motor[3];               
               
                if(Start_Word==10){TIM_PWM_Config();}        //通过遥控器控制电机启动



最佳答案

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

那就是电源问题了,选好点的电源芯片吧
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-4-17 11:38:03 | 显示全部楼层
寒尘 发表于 2018-5-8 21:59
来更新一下答案,希望能帮到其他人。用那个有问题的板子调了一段时间,发现这样不行,我就干脆重新画了个板 ...

那就是电源问题了,选好点的电源芯片吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-4-2
在线时间
8 小时
 楼主| 发表于 2018-4-17 11:54:22 | 显示全部楼层
电机转动时,程序应该是正常运行的,串口和定时器指示灯工作正常。忘了改一些注释了。。。新人第一次发帖,希望不要沉。。。
回复

使用道具 举报

13

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
372
金钱
372
注册时间
2018-1-22
在线时间
118 小时
发表于 2018-4-17 12:48:53 | 显示全部楼层
有没有搞清楚是没收到2.4G的信息还是收到了不执行
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-4-2
在线时间
8 小时
 楼主| 发表于 2018-4-17 13:23:00 | 显示全部楼层
lvb 发表于 2018-4-17 12:48
有没有搞清楚是没收到2.4G的信息还是收到了不执行

谢谢你的回答,应该是没收到,我一直在用串口观察接收到的数据。我刚用开发板试了下,功能正常,基本可以确定问题出在板子上了,我再去查查电路,看是不是,电机一转,有地方接触不良了。或者,我去请教懂PCB布线的人,帮我看看图哪不对。
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-4-2
在线时间
8 小时
 楼主| 发表于 2018-4-18 11:24:33 | 显示全部楼层
将PWM频率提高到20K,和电源最接近的那个电机功能就可以实现了,其他还是不行,原先频率只有5K。。。
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-4-2
在线时间
8 小时
 楼主| 发表于 2018-5-8 21:59:10 | 显示全部楼层
来更新一下答案,希望能帮到其他人。用那个有问题的板子调了一段时间,发现这样不行,我就干脆重新画了个板子,画的很仔细,直接把2,4G模块放在电源旁边,又加了两个滤波电容,还有铺部分地,铺电池电压,然后很开心的去打板子去了,回来一切焊好,让电机转起来,然后用遥控器遥控,直接成功,当时很开心,可到了下午,发现又不行了,赶紧查电路,可是一整天过去了还是没查出来,但是没办法,还是得继续弄,只好先凑合用,把程序改完,能调的都调了,又回头继续查,用示波器看了电机转动时,2,4G模块的供电电压波形,发现波形很坏,都快成锯齿波了,频率在1k到5k中间跳动。我这才意识到一个问题,我给的滤波电容可能太小了,根本不能抑制电机对电源的干扰,又赶紧淘宝下单买了一包电解电容,常用型号都有,今天下午才到,回来赶紧找了个470UF的直接并上,果然,问题解决了,电机工作时,2.4G通信正常。

FLY1.jpg
FLY.png
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-5-9 08:16:51 | 显示全部楼层
另外还有一点,如果可以的话可以在电机两端并联104电容,可以抑制电机换向器火花产生的电磁波对无线模块的影响
十六进制带我飞。
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-4-2
在线时间
8 小时
 楼主| 发表于 2018-5-9 11:46:04 | 显示全部楼层
又有新问题诞生,并的电解电容有使用时间限制,不知道什么鬼,用着用着就不行了,得重新换一个
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-4-2
在线时间
8 小时
 楼主| 发表于 2018-5-9 11:52:43 | 显示全部楼层
DreamWaterPro 发表于 2018-5-9 08:16
另外还有一点,如果可以的话可以在电机两端并联104电容,可以抑制电机换向器火花产生的电磁波对无线模块的 ...

好的,谢谢你的回答,我之前有试过,可能是我的方法有问题,效果不太好,我这次再试试
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2018-5-9 20:34:37 | 显示全部楼层
这PCB布的也是很有个性
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-4-2
在线时间
8 小时
 楼主| 发表于 2018-5-10 10:20:10 | 显示全部楼层
wxjhby 发表于 2018-5-9 20:34
这PCB布的也是很有个性

新手,还在学习中
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-4-2
在线时间
8 小时
 楼主| 发表于 2018-5-10 10:33:29 | 显示全部楼层
寒尘 发表于 2018-5-9 11:46
又有新问题诞生,并的电解电容有使用时间限制,不知道什么鬼,用着用着就不行了,得重新换一个

这个是我搞错了,是程序的问题,不是硬件的问题
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-4-2
在线时间
8 小时
 楼主| 发表于 2018-5-10 10:34:58 | 显示全部楼层
得到一个经验,如果不监视数据,就尽量不要用串口,printf 这个函数感觉运行时间有点长,每次一打印数据,我的2.4G就不灵敏了。将接收数据的函数放在主函数中执行,其他放在中断里面能好点。
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-4-2
在线时间
8 小时
 楼主| 发表于 2018-7-4 10:28:42 | 显示全部楼层
很开心,毕业了,小四轴成功起飞,效果还不错
本着开源的精神,把有关硬件和软件分享出来,谢谢大家之前的帮助
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-4-2
在线时间
8 小时
 楼主| 发表于 2018-7-4 10:31:03 | 显示全部楼层
为啥不能上传文件啊。。。。
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-4-2
在线时间
8 小时
 楼主| 发表于 2018-7-4 15:04:28 | 显示全部楼层
回复

使用道具 举报

20

主题

227

帖子

0

精华

高级会员

Rank: 4

积分
605
金钱
605
注册时间
2017-7-14
在线时间
116 小时
发表于 2018-7-4 16:31:40 | 显示全部楼层
本帖最后由 SimpleLife 于 2018-7-4 16:33 编辑

帮顶帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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