-
串行PID调试困惑
本帖最后由feiyinglala于2024-10-2110:45编辑这几天在摸索着调试自己手搓的四轴飞行器,机架用的大疆F450,飞控板自己画的,参考了一些网上的PID代码,控制流程如下图1,现在处于“烤四轴飞行器”单轴调试状态现在遇到两个困惑:1.我目前的控制周期是,测量周期每15ms一次,内环控制周期30ms一次,外环控制周期是60ms一次,这样的控制周期有没有不妥?2.目前控制参数,调试有点不得要领,如图2,飞机基本平稳后,手动施加干扰,回复过程有点慢,请问目前内环参数中,PID哪个需要调整。图1控制流程图图2调试内环PID曲线(手动施加干扰)两个图片在下边压缩包里也有一份
2024-10-21 1 -
STM32F4驱动OV5640卡在EV6
本帖最后由feiyinglala于2022-10-1419:27编辑使用STM32F429驱动OV5640模块,在使用硬件I2C(PB8PB9)驱动,始终无法正常读写,OV5640地址配置为0x78现象:总线可以正常启动,但发送完从设备地址后,立马卡住,在EV6中无法跳过I2C1读取OV5640代码如下:/***@brief从OV5640寄存器中读取一个字节的数据*@paramAddr:寄存器地址*@retval返回读取得的数据*/u8OV5640_ReadReg(uint16_tAddr){uint32_ttimeout=DCMI_TIMEOUT_MAX;uint8_tData=0;while(I2C_GetFlagStatus(CAMERA_I2C,I2C_FLAG_BUSY))if((timeout--)==0)return0xFF;//1.开始【发送】--*GeneratetheStartCondition*I2C_GenerateSTART(CAMERA_I2C,ENABLE);//启动I2CSTM32进入主模式标志:SR1->SB0-1//----*TestonCAMERA_I2CEV5andclearit*timeout=DCMI_TIMEOUT_MAX;//----*Initializetimeoutvalue*while(!I2C_CheckEvent(CAMERA_I2C,I2C_EVENT_MASTER_MODE_SELECT)){//----*Ifthetimeoutdelayisexeeded,exitwitherrorcode*if((timeout--)==0)return0xFF;}//2.发送从设备地址-主发送--*SendDCMIselcteddeviceslaveAddressforwrite*I2C_Send7bitAddress(CAMERA_I2C,OV5640_DEVICE_ADDRESS,I2C_Direction_Transmitter);//启动I2CSTM32发送从地址标志:SR1->ADDR0-1【一直收不到】//执行完此句后,EV5结束,DR被赋值,SB1被重置//20220922受https://shequ.stmicroelectronics.cn/forum.php?mod=viewthread&tid=602816启发,需排查此步后,EV5对应的A如何检测?标志是啥//----*TestonI2C1EV6andclearit*timeout=DCMI_TIMEOUT_MAX;//----*Initializetimeoutvalue*while(!I2C_CheckEvent(CAMERA_I2C,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){//----*Ifthetimeoutdelayisexeeded,exitwitherrorcode*if((timeout--)==0)return0xFF;//[卡在这行,读取ID时}//3.1发送寄存器地址--*SendI2C1locationaddressMSB*I2C_SendData(CAMERA_I2C,(uint8_t)((Addr>>8)&0xFF));//【存疑】是
2022-10-14 4 -
arduino驱动nRF24L01单发数据失败
目的:借鉴Mirf库,使用arduino驱动nRF模块,通过串口监视工作状态特别说明:我将模块配置为了无需ACK的单发状态(EN_AA/EN_RXADDR/SETUP_RETR均配置为0x00)现象问题:寄存器配置显示正确,数据也加载到FIFO中了,但就是发不出去(STATUS=0E,FIFO_STATUS=0X01)串口通信正常,模块是正常的(换到STM32驱动就可以发出去)引脚关系:CE->8//*CSN->7//*SCK->13*MOSI->11*MISO->12*IRQ->2整体思路:nRF初始化默认配置为接收状态,在接到电脑通过串口发送的命令后启动发送setup():串口和定时器初始化Mirf.init,配置CE和CSN引脚Mirf.config配置为接收模式--清空FIFO接收区loop():读取当前EN_AA/EN_RXADDR/SETUP_RETR/CONFIG寄存器配置状态和STATUS、FIFO_STATUS寄存器状态Mirf.send检验是否在发送状态---配置为发送模式---清空FIFO发送区---CE置高发送读取发送后STATUS、FIFO_STATUS寄存器配置状态延时循环计数
2022-06-11 0 -
arduino驱动nRF24L01+数据发不出去
目的:借鉴Mirf库,使用arduinonano驱动nRF模块,计算机通过串口监视其工作状态特别说明:我将模块配置为了无需ACK的单发状态(EN_AA/EN_RXADDR/SETUP_RETR均配置为0x00)现象问题:寄存器配置显示正确,数据也加载到FIFO中了,但就是发不出去(STATUS=0E,FIFO_STATUS=0X01)串口通信正常,模块是正常的(换到STM32驱动就可以发出去)引脚关系:CE->8//*CSN->7//*SCK->13*MOSI->11*MISO->12*IRQ->2整体思路:nRF初始化默认配置为接收状态,在接到电脑通过串口发送的命令后启动发送setup():串口和定时器初始化Mirf.init,配置CE和CSN引脚Mirf.config配置为接收模式--清空FIFO接收区loop():读取当前EN_AA/EN_RXADDR/SETUP_RETR/CONFIG寄存器配置状态和STATUS、FIFO_STATUS寄存器状态Mirf.send检验是否在发送状态---配置为发送模式---清空FIFO发送区---CE置高发送读取发送后STATUS、FIFO_STATUS寄存器配置状态延时循环计数串口接收到的信息为Startingwireless...Wirelessinitialized!循环第0次EN_AA:1EN_RXADDR:1SETUP_RETR:3CONFIG:1F发送前STATUS:E发送前FIFO_STATUS:11Mirf中send函数段:status=E发送后STATUS:E发送后FIFO_STATUS1:1循环第1次EN_AA:0EN_RXADDR:0SETUP_RETR:0CONFIG:3E发送前STATUS:E发送前FIFO_STATUS:1
2022-06-11 3 -
25M晶振布线疑问
本帖最后由feiyinglala于2021-3-1211:22编辑当前利用STM32F429做一个板子,用到了晶振25M,现在布线遇到一个问题,因为这个晶振是4脚的封装。1、3脚分别对应STM32的OSC输入输出,拉引线时候难保证两条引线的严格等长(如图中所示),现在有2个疑问:1.布线时候是否要保证STM32的引脚至晶振的1,3脚引线长度完全一致?2.AltiumDesigner中,如何调整器件摆放位置可以实现等长引线。请各位大佬不吝赐教,谢谢谢谢谢谢
2021-03-12 25