嘉立创产业服务站群
发作品签到
专业版

minifoc_V2

工程标签

8.0k
0
0
34

简介

在iMcHineSe大佬的基础上添加了OLED显示模块,电机使用DVR8313将标准版迁移至专业版,将布局和走线进行优化,使用手动布线,尽量使走线美观,同时添加一个按键和一个stlink烧录接口。

简介:在iMcHineSe大佬的基础上添加了OLED显示模块,电机使用DVR8313将标准版迁移至专业版,将布局和走线进行优化,使用手动布线,尽量使走线美观,同时添加一个按键和一个stlink烧录接口。

开源协议

GPL 3.0

创建时间:2022-10-11 00:34:09更新时间:2022-10-14 01:16:34

描述

在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无刷云台电机(淘宝和咸鱼均有售卖)

整体外观图:

 

wYtxGWhf8BlJpmbetByg8CwuIV70CodNf7Vz8ITG.jpeg

 

 

交互式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

暂无BOM

附件

序号文件名称下载次数
1
video_20221011_110627.mp4
866
2
minisimplefoc_c8t6.zip
401
3
4008云台电机.SLDPRT
96
4
4008云台电机.STL
86
5
闭环控制空载时电流大小.mp4
761
6
闭环控制c8t6 模拟IIC AS5600闭环控制.zip
416
克隆工程
添加到专辑
0
0
分享
侵权投诉

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航