完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
小弟的毕设是用STM32F030做一个小四轴,这两天刚把硬件做完,准备调试程序,可是却碰到了一个怪问题,就是不接电机的时候,可以通过遥控器去控制四路PWM的占空比大小,可是一接上电机,电机转起来后,2.4G就不通信了,2.4G芯片我用的是NRF24L01,稳压芯片用的是AMS1117。求各路大神帮我分析下原因,万分感谢。
我先说一下,我的几个思路,给各位抛砖引玉。 硬件问题 1、一开始,我怀疑是电池电压不足,就换了个充满电的电池,电池电压达4.2V,可是问题依旧。 2、怕电池还是不能说明问题,我就找来了直流源,直接上5V,最大电流给到2A,当电机工作时,我去测各模块的电压,都能够维持在3.3V左右。甚至,我直接用电流源输出3.3V到2.4模块两端,可是问题还是存在。 3、布线可能有问题,这个不好验证,我准备一会儿用开发板连短线试一下。这个我上传图片,请大家帮我看一下,右侧双四脚直插封装是2.4G。 软件问题 硬件暂时没有找到问题,我就去想程序或许有问题。但是,在不接电机的时候,我通过示波器可以看到,遥控器的确是可以控制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 ERRORn");} 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();} //通过遥控器控制电机启动 |
|
相关推荐
17个回答
|
|
那就是电源问题了,选好点的电源芯片吧
|
|
|
|
电机转动时,程序应该是正常运行的,串口和定时器指示灯工作正常。忘了改一些注释了。。。新人第一次发帖,希望不要沉。。。
|
|
|
|
有没有搞清楚是没收到2.4G的信息还是收到了不执行
|
|
|
|
谢谢你的回答,应该是没收到,我一直在用串口观察接收到的数据。我刚用开发板试了下,功能正常,基本可以确定问题出在板子上了,我再去查查电路,看是不是,电机一转,有地方接触不良了。或者,我去请教懂PCB布线的人,帮我看看图哪不对。
|
|
|
|
将PWM频率提高到20K,和电源最接近的那个电机功能就可以实现了,其他还是不行,原先频率只有5K。。。
|
|
|
|
来更新一下答案,希望能帮到其他人。用那个有问题的板子调了一段时间,发现这样不行,我就干脆重新画了个板子,画的很仔细,直接把2,4G模块放在电源旁边,又加了两个滤波电容,还有铺部分地,铺电池电压,然后很开心的去打板子去了,回来一切焊好,让电机转起来,然后用遥控器遥控,直接成功,当时很开心,可到了下午,发现又不行了,赶紧查电路,可是一整天过去了还是没查出来,但是没办法,还是得继续弄,只好先凑合用,把程序改完,能调的都调了,又回头继续查,用示波器看了电机转动时,2,4G模块的供电电压波形,发现波形很坏,都快成锯齿波了,频率在1k到5k中间跳动。我这才意识到一个问题,我给的滤波电容可能太小了,根本不能抑制电机对电源的干扰,又赶紧淘宝下单买了一包电解电容,常用型号都有,今天下午才到,回来赶紧找了个470UF的直接并上,果然,问题解决了,电机工作时,2.4G通信正常。
|
|
|
|
另外还有一点,如果可以的话可以在电机两端并联104电容,可以抑制电机换向器火花产生的电磁波对无线模块的影响
|
|
|
|
又有新问题诞生,并的电解电容有使用时间限制,不知道什么鬼,用着用着就不行了,得重新换一个
|
|
|
|
好的,谢谢你的回答,我之前有试过,可能是我的方法有问题,效果不太好,我这次再试试
|
|
|
|
这PCB布的也是很有个性
|
|
|
|
新手,还在学习中
|
|
|
|
这个是我搞错了,是程序的问题,不是硬件的问题
|
|
|
|
得到一个经验,如果不监视数据,就尽量不要用串口,printf 这个函数感觉运行时间有点长,每次一打印数据,我的2.4G就不灵敏了。将接收数据的函数放在主函数中执行,其他放在中断里面能好点。
|
|
|
|
|
|
|
|
为啥不能上传文件啊。。。。
|
|
|
|
只能给百度云链接了https://pan.baidu.com/s/1JUdGjTAZz9ipV75ifnvxJQ
|
|
|
|
帮顶帮顶
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2331 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2076 浏览 5 评论
2769 浏览 3 评论
2527 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2470 浏览 4 评论
541浏览 0评论
545浏览 0评论
326浏览 0评论
145浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-20 03:35 , Processed in 1.377727 second(s), Total 88, Slave 74 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号