
minifoc_V2
简介
在iMcHineSe大佬的基础上添加了OLED显示模块,电机使用DVR8313将标准版迁移至专业版,将布局和走线进行优化,使用手动布线,尽量使走线美观,同时添加一个按键和一个stlink烧录接口。
简介:在iMcHineSe大佬的基础上添加了OLED显示模块,电机使用DVR8313将标准版迁移至专业版,将布局和走线进行优化,使用手动布线,尽量使走线美观,同时添加一个按键和一个stlink烧录接口。开源协议
:GPL 3.0
描述
在iMcHineSe大佬原理图的基础上添加了OLED显示模块(Mini_SimpleFOC无刷电机驱控一体板 - 嘉立创EDA开源硬件平台 (oshwhub.com)),同时将标准版迁移至专业版,将布局和走线进行优化,使用手动布线,尽量使走线美观,同时添加一个按键来实现模式的切换(目前开发板初始化成功,V1版本忘记加入串口,V2版本已优化,加入串口,目前正在打板验证)。
加入OLED,OLED使用的是JLINK对应的PB4,PB3引脚,使用时需要打开AFIO时钟和失能JLINK功能。
加入stlink排针,可以使用stlink进行程序烧录,方便调试。
电机驱动模块使用TI公司的DVR8313PWPR
AMS1117使用LDO降压可能不太合适,但是DC-DC太占空间了,所以用的1117,有能力的可以进行一个优化(主要是我器件选型不太会)
电机使用4008或者4010无刷云台电机(淘宝和咸鱼均有售卖)
整体外观图:
交互式BOM表(可以将立创EDA中的PCB导出AD格式文件,然后运行AD脚本(https://github.com/lianlian33/InteractiveHtmlBomForAD)生成,具体使用教程可以在B站搜索)
旋钮上方指针的3D模型(stl和sldprt),使用solidworks2021打开(已添加至附件)
软件模拟IIC读取AS5600角度值显示在OLED上
第二行为RAWNUM(原始数据,类型为unsinedshort),第三行为角度数据(角度制)
可以对源代码进行修改,得到软件模拟(因为我第一版使用IIC的AS5600 (原理图接线接错了,接到了PA6,PA7,这两个引脚不支持硬件IIC所以代码就改为软件IIC驱动了,现在上传的版本已经将引脚改到硬件IIC)和忘记加装串口,所以就将和串口相关的printf就替换成了OLED显示的函数(OLED也为模拟IIC驱动,只需修改相应的引脚即可))
as5600.c文件:
#include "as5600.h"
#include "delay.h"
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_6|GPIO_Pin_7);
}
void IIC_Start(void)
{
SDA_OUT();
IIC_SDA=1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;
delay_us(4);
IIC_SCL=0;
}
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;
delay_us(4);
}
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;
return 0;
}
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;//
for(t=0;t<8;t++)
{
if((txd&0x80)>>7)
IIC_SDA=1;
else
IIC_SDA=0;
txd<<=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
}
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(1);
}
if (!ack)
IIC_NAck();
else
IIC_Ack();
return receive;
}
//读取一个字节
u8 AS5600_ReadOneByte(u16 ReadAddr)
{
u8 temp=-1;
IIC_Start();
IIC_Send_Byte((0X36<<1)|0x00);
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte((0X36<<1)|0x01);
IIC_Wait_Ack();
temp=IIC_Read_Byte(0);
IIC_Stop();
return temp;
}
//写入一个字节的数据
void AS5600_WriteOneByte(u16 WriteAddr,u8 WriteData)
{
IIC_Start();
IIC_Send_Byte((0X36<<1)|0x00);
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(WriteData);
IIC_Wait_Ack();
IIC_Stop();
delay_ms(10);
}
//得到原始数据
u16 AS5600_ReadTwoByte(u16 ReadAddr_hi,u16 ReadAddr_lo)
{
u16 TwoByte_Data=-1;
u8 hi_Data=0,lo_Data=0;
hi_Data=AS5600_ReadOneByte(ReadAddr_hi);
lo_Data=AS5600_ReadOneByte(ReadAddr_lo);
TwoByte_Data = (hi_Data<<8)|lo_Data;
return TwoByte_Data;
}
主要就是软件模拟IIC实现控制(代码原工程已放在附件)
视频主要包括正常运行,软件模拟IIC获取AS5600角度值闭环控制,闭环控制空载时电流大小(50ma左右)
设计图

BOM


评论