[创业] 【21ic DIY秀】+DIY自己的数控系统

[复制链接]
1134|20
 楼主 | 2019-3-9 20:34 | 显示全部楼层 |阅读模式
        写在前面的话:趁着二姨家的这次DIY活动,我也发一个前端时间自己DIY的简易数控系统吧,由一块数控主板和触摸屏构成,初步可以通过触摸屏控制主板的IO进行开关,以及显示主板采集的多路温度数据。
一,背景
      在数控这个行业呆了几年,最近感觉很迷茫。打工工资永远都是千年不变,消费(主要是物价和租房)越来越高,再加之年龄上也到了而立之年。感觉都不知道做什么了,看看周边的同事都陆续开始走自主创业之路,也最终我们这个职业是转行的命运,所以提前给自己做些技术积累,做些准备工作,所以就利用空余的时间做了个简易的数控系统,再慢慢优化以便不时之需。




二,硬件介绍;(待更新)


三,触控屏;(待更新)


四,固件和上位机设计。(待更新)


| 2019-3-9 21:37 | 显示全部楼层
这个围观一下  
 楼主 | 2019-3-9 23:02 | 显示全部楼层
二,硬件介绍;硬件部分,主要是STM32F103加上IO模块,模拟量输入输出,通信接口,步进电机驱动等功能。
电源24V输入,共同在输入,输出和电机驱动部分使用。
5V电源在通信接口CAN和模拟量输出的滤波电路共用。
其余部分使用3.3V。


1,电源部分:24V输入,转5V和3.3V

2,MCU:stm32f103r8





,3,input
,
4,output



5,模拟输入/输出

6,通信接口

7,步进电机驱动




附件是全部电路原理图的PDF


水平有限,欢迎大家指点指点。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2019-3-10 15:06 | 显示全部楼层
你们一般用无源晶振,是吗?
 楼主 | 2019-3-10 17:39 | 显示全部楼层
taohairen 发表于 2019-3-10 15:06
你们一般用无源晶振,是吗?

无源和有源都有人用啊。看成本和精度要求以及工作环境等情况。
 楼主 | 2019-3-11 00:31 | 显示全部楼层
三,触控屏;
        触控屏选用的是北京迪文的DMT80480T070_18WT,7.0 英寸 800×480 图形点阵 K600+内核 65K 色 DGUS 屏,这个是咸鱼上面淘回来的,100块钱。
      迪文屏的好处就是开发周期很短,有点像做PPT一样,做好背景和内容布局就在软件里设置好寄存器和指令既可使用,把工程下载到SD卡中,重新启动触摸屏就可以进行操作。


开发环境如下图





最终效果图:













具体操作是触控了屏幕上面的按键就会下发一个串口指令,主板接收到串口数据进行解码从而控制外设的开关或者DAC的转换数据。数据的具体形式详情看接着更新的软件部分。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2019-3-11 10:40 | 显示全部楼层
不错,尤其是这个屏的开发环境,看着很好用啊,比写gui方便多了
| 2019-3-11 13:31 | 显示全部楼层
不错,支持一下
 楼主 | 2019-3-11 20:11 | 显示全部楼层
whtwhtw 发表于 2019-3-11 10:40
不错,尤其是这个屏的开发环境,看着很好用啊,比写gui方便多了

确实是很方便,但是对于我这种审美不足的人来说,做个界面就有点不是专业了。。。
 楼主 | 2019-3-11 20:17 | 显示全部楼层
tvb2058 发表于 2019-3-11 13:31
不错,支持一下

支持我就帮帮点赞我吧。
 楼主 | 2019-3-11 20:37 | 显示全部楼层
四。PCB截图更新     整个板尺寸10*10cm,为特殊尺寸特价板,打板费用60元/10pcs。自己DIY成本是必须要最低。
   PCB整体走线和布局。



PCB的敷铜


PCB板的正面丝印

板的gerber。


以下是BOM(仅供参考)



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2019-3-12 08:08 | 显示全部楼层
飞扬自我 发表于 2019-3-11 20:37
四。PCB截图更新     整个板尺寸10*10cm,为特殊尺寸特价板,打板费用60元/10pcs。自己DIY成本是必须要最低 ...

我觉得你的思路是对的, 老了说不好就靠这点经验混点钱 养老呢
| 2019-3-12 08:08 | 显示全部楼层
飞扬自我 发表于 2019-3-11 20:37
四。PCB截图更新     整个板尺寸10*10cm,为特殊尺寸特价板,打板费用60元/10pcs。自己DIY成本是必须要最低 ...

我觉得你的思路是对的, 老了说不好就靠这点经验混点钱 养老呢
 楼主 | 2019-3-13 23:35 | 显示全部楼层
本帖最后由 飞扬自我 于 2019-3-13 23:41 编辑

四,触控屏开发与下位机软件开发
   4.1触控屏开发。
     每个地方都是一个地址,所以后续的编程和显示都是按照设置的地址进行操作。具体操作设置见下图:













   4.2下位机软件开发
     通过上面的触控,每一次触控触摸屏都会自动下发一次指令,具体指令见表。
     

   

  对于本次的指令只要是0x80,0x81,0x82,0x83以及0x84指令。

  1. SerialScreenData_TypeDef SerialScreenData; //定义串口屏结构组
  2. /*********************************初始化结构体*************************************************/

  3. void inint_SerialScreenData(void)
  4. {
  5.         //接收信息缓冲区
  6.          u8 counter;
  7.          for(counter=0;counter<9;counter++)
  8.           SerialScreenData.ProcesData[counter]=0;        //串口屏下发信息缓冲区

  9.         SerialScreenData.ProcesDataClear_flag=0;         //数据处理缓冲数组清除标志位 1允许清理
  10.         SerialScreenData.Updata_flag=0x01;               //更新数据标志作为数据处理的判断标志        
  11.          
  12.         //输出IO设置相关
  13.         SerialScreenData.OutputDataSet=0x00;             //用于存储Output的设置数据
  14.         SerialScreenData.UartWrite82Input[0]=0x5A;       //串口用82指令写动态波形数据Buf 0 帧头
  15.         SerialScreenData.UartWrite82Input[1]=0xA5;       //串口用82指令写动态波形数据Buf 1 帧头
  16.         SerialScreenData.UartWrite82Input[2]=0x05;       //串口用82指令写动态波形数据Buf 2 操作码
  17.         SerialScreenData.UartWrite82Input[3]=0x82;       //串口用82指令写动态波形数据Buf 3 发送字节数据
  18.         SerialScreenData.UartWrite82Input[4]=0x01;       //串口用82指令写动态波形数据Buf 4 地址高位
  19.         for(counter=5;counter<8;counter++)
  20.          SerialScreenData.UartWrite82Input[counter]=0x00;   //串口用82指令写动态波形数据Buf        
  21.          
  22.         //DAC设置相关
  23.         for(counter=0;counter<2;counter++)         
  24.         SerialScreenData.DACData[counter]=0x00;          //用于存储串口屏下发的DAC输出电压值转换后的数据 DACData[0]--->DAC1;  DACData[1]--->DAC2
  25.         SerialScreenData.DACChannel=0x00;                //设置DAC的通道    0x00000000----->DAC_Channel_1;  0x00000010----->DAC_Channel_2;
  26.         
  27.         //画图波形设置   adc
  28.         for(counter=0;counter<8;counter++)         
  29.         SerialScreenData.Channelflag[counter]=0x00;      //Channelflag[0]--->channel_1#;...........;Channelflag[7]--->channel_8#
  30.         
  31.         SerialScreenData.UartWrite84Buf[0]=0x5A;       //串口用84指令写动态波形数据Buf 0 帧头
  32.         SerialScreenData.UartWrite84Buf[1]=0xA5;       //串口用84指令写动态波形数据Buf 1 帧头
  33.         SerialScreenData.UartWrite84Buf[2]=0x12;       //串口用84指令写动态波形数据Buf 2 发送数量
  34.         SerialScreenData.UartWrite84Buf[3]=0x84;       //串口用84指令写动态波形数据Buf 3 操作码
  35.         SerialScreenData.UartWrite84Buf[4]=0xff;       //串口用84指令写动态波形数据Buf 4 通道标识
  36.         for(counter=5;counter<21;counter++)
  37.          SerialScreenData.UartWrite84Buf[counter]=0x00;   //串口用84指令写动态波形数据Buf        
  38.          
  39.         //工作状态标志位
  40.         for(counter=0;counter<4;counter++)
  41.         SerialScreenData.State[counter]=0x00;           // State[0]  运行;     State[1]  急停;     State[2]  报错;     State[3]  停止
  42.         SerialScreenData.WarnningCode=0x00;             //0x00~0xff   运行报警代码
  43.         
  44.         //子站参数相关
  45.         SerialScreenData.UartWrite82Node[0]=0x5A;       //串口用82指令写动态波形数据Buf 0 帧头      //设置的子站地址 16进制
  46.         SerialScreenData.UartWrite82Node[1]=0xA5;       //串口用82指令写动态波形数据Buf 1 帧头
  47.         SerialScreenData.UartWrite82Node[2]=0x04;       //串口用82指令写动态波形数据Buf 2 操作码
  48.         SerialScreenData.UartWrite82Node[3]=0x82;       //串口用82指令写动态波形数据Buf 3 发送字节数据
  49.         SerialScreenData.UartWrite82Node[4]=0x00;       //串口用82指令写动态波形数据Buf 4 地址高位
  50.         SerialScreenData.UartWrite82Node[5]=0x6A;       //串口用82指令写动态波形数据Buf 4 地址低位        
  51.   SerialScreenData.UartWrite82Node[6]=0x00;       //串口用82指令写动态波形数据Buf        
  52.         
  53.         //10ms定时计数器
  54.                 SerialScreenData.MsCounter=0;
  55. }
复制代码

主控程序的部分代码
  1.   while(1)
  2.   {  
  3.                 if(SerialScreenData.ProcesDataClear_flag)  //数据处理完,数据等待接收
  4.                 {
  5.                         if(SerialScreenData.DACChannel==0x00) //DAC1
  6.                           Dac_Set_Vol(SerialScreenData.DACData[0],SerialScreenData.DACChannel);
  7.                         if(SerialScreenData.DACChannel==0x10)  //DAC2
  8.                           Dac_Set_Vol(SerialScreenData.DACData[1],SerialScreenData.DACChannel);
  9.                        
  10.                         WriteByte595(~SerialScreenData.OutputDataSet);       
  11.                         SerialScreenData.ProcesDataClear_flag=0x00;
  12.                 }               
  13.                
  14.                 if(SerialScreenData.MsCounter==50)  //50ms
  15.                 {
  16.                                 u8 Inputdata=0x00;
  17.                                 u8 Nodestation=0x00;
  18.                           u8 bitcouter=0;
  19.                                 // Input
  20.                                 GPIOInputdata=ReadWord165();
  21.                                 Inputdata=GPIOInputdata&0x00ff;
  22.                           for(bitcouter=0;bitcouter<8;bitcouter++)
  23.                             {
  24.                                                 if(Inputdata&(0x01<<bitcouter))                                                       
  25.                                                    SerialScreenData.UartWrite82Input[7]=0x00;
  26.                                                 else
  27.                                                    SerialScreenData.UartWrite82Input[7]=0x01;
  28.                                                 SerialScreenData.UartWrite82Input[5]=bitcouter*2;
  29.                                     USART2Write(SerialScreenData.UartWrite82Input,8);
  30.                                         }
  31.                                
  32.                                
  33.                                
  34.                                 //Node station
  35.                                 Nodestation=(GPIOInputdata&0xff00)>>8;
  36.                                 SerialScreenData.UartWrite82Node[6]=Nodestation;
  37.         USART2Write(SerialScreenData.UartWrite82Node,7);
  38.                 }
  39.                
  40.                
  41.          if(SerialScreenData.MsCounter>100) // 100ms任务                         
  42.                   {                               

  43.                                 //画图
  44.                                 if(SerialScreenData.Channelflag[0]==1)
  45.                                   SerialScreenData.UartWrite84Buf[6]=125+125*sin(pi*(i0+= 2)/180+pi/24); //channel_0
  46.                                 else
  47.                                         SerialScreenData.UartWrite84Buf[6]=0x00;
  48.                                
  49.                                 if(SerialScreenData.Channelflag[1]==1)                               
  50.                                   SerialScreenData.UartWrite84Buf[8] =125+125*sin(pi*(i1+= 4)/180+pi/12);  //channel_1
  51.                                 else
  52.                                         SerialScreenData.UartWrite84Buf[8]=0x00;
  53.                                
  54.                                 if(SerialScreenData.Channelflag[2]==1)
  55.                                    SerialScreenData.UartWrite84Buf[10]=125+125*sin(pi*(i2+= 6)/180+pi/10);  //channel_2
  56.                                 else
  57.                                         SerialScreenData.UartWrite84Buf[10]=0x00;
  58.                                        
  59.                                 if(SerialScreenData.Channelflag[3]==1)
  60.                                    SerialScreenData.UartWrite84Buf[12]=125+125*sin(pi*(i3+= 8)/180+pi/8);  //channel_3
  61.                                 else
  62.                                         SerialScreenData.UartWrite84Buf[12]=0x00;

  63.                                 if(SerialScreenData.Channelflag[4]==1)
  64.                                    SerialScreenData.UartWrite84Buf[14]=125+125*sin(pi*(i4+=10)/180+pi/6);  //channel_4
  65.                                 else
  66.                                         SerialScreenData.UartWrite84Buf[14]=0x00;
  67.                                        
  68.                                 if(SerialScreenData.Channelflag[5]==1)
  69.                                    SerialScreenData.UartWrite84Buf[16]=125+125*sin(pi*(i5+=12)/180+pi/4);  //channel_5
  70.                                 else
  71.                                         SerialScreenData.UartWrite84Buf[16]=0x00;
  72.                                        
  73.                                 if(SerialScreenData.Channelflag[6]==1)                       
  74.                                    SerialScreenData.UartWrite84Buf[18]=125+125*sin(pi*(i6+=14)/180+pi/3);  //channel_6
  75.                                 else
  76.                                    SerialScreenData.UartWrite84Buf[18]=0x00;               
  77.                                
  78.                                 if(SerialScreenData.Channelflag[7]==1)
  79.                                    SerialScreenData.UartWrite84Buf[20]=125+125*sin(pi*(i7+=16)/180);  //channel_7
  80.                                 else
  81.                                    SerialScreenData.UartWrite84Buf[20]=0x00;                                       
  82.                                  if(i0==359)                         i0=0;
  83.                                  if(i1==359)                         i1=0;
  84.                                  if(i2==359)                         i2=0;
  85.                                  if(i3==359)                         i3=0;
  86.                                  if(i4==359)                         i4=0;
  87.                                  if(i5==359)                         i5=0;
  88.                                  if(i6==359)                         i6=0;
  89.                                  if(i7==359)                         i7=0;               
  90.                                
  91.                    USART2Write(SerialScreenData.UartWrite84Buf,21);
  92.                    SerialScreenData.MsCounter=0x00;
  93.                          if((j++)%2==0)
  94.                     GPIO_SetBits(GPIOC,GPIO_Pin_12);
  95.                          else
  96.                                  GPIO_ResetBits(GPIOC,GPIO_Pin_12);

  97.                 }                 
复制代码



串口数据识别代码段:
  1. /******************************接收中断服务程序************************************/
  2. //迪文串口屏触控输出指令接收
  3. //       帧头 数据长度 操作码   地址  寄存器数量   数值
  4. //急停: 5A A5   06      83      00 55     01       00 01
  5. //运行: 5A A5   06      83      00 55     01       00 80
  6. //报警: 5A A5   06      83      00 55     01       00 08
  7. //DAC1: 5A A5   06      83      00 61     01       00 01  (10mv)
  8. //DAC2: 5A A5   06      83      00 65     01       00 01  (10mv)
  9. //DAC1: 5A A5   06      83      00 6A     01       00 38  (十进制为65)
  10. //通道: 5A A5   06      83      00 50     01       80 00  (1-7 的加权值为80 40 20 10 08 04 02 01 高8位)
  11. //IN:     (无输出)
  12. //OUT:   5A A5   06     83      00 5A     01       00 80  (1-7 的加权值为80 40 20 10 08 04 02 01 低8位)

  13. void USART2_IRQHandler(void)
  14. {
  15. //        SerialScreenData_TypeDef  SerialScreenData;  //定义串口屏结构组
  16.         u8 get_char;
  17.         u16 time_out=10000; //等待超时
  18.         u8 j=0;
  19.         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  20.         {        
  21.           get_char=USART2->DR;
  22.     if(GetFinish_flag==0) //不是接收数据状态
  23.                 {
  24.                  if(State_flag==1)  //等待帧头 5A A5
  25.                  {
  26.                   DataReg[1]=DataReg[0];
  27.                         DataReg[0]=get_char;    //接收的字节进行存储等待帧头校验
  28.                          
  29.                          if((DataReg[0]==0xa5)&&(DataReg[1]==0x5a))  //帧头校验
  30.                          {
  31.                                  State_flag=0x00;                       //帧头校验成功
  32.                                  GetFinish_flag=1;          //接收数据标志物置1
  33.                      Getdata[0]=DataReg[0];
  34.                            Getdata[1]=DataReg[1];   //存储帧头到DataReg[]数组;                                       
  35.                          }
  36.                          else
  37.                          {
  38.                                  State_flag=0x01;                                        //帧头校验失败
  39.                                  GetFinish_flag=0x00;          //接收数据标志物置0,继续等待帧头
  40.                          }
  41.                  }
  42.          }
  43.          else  //帧头校验成功开始接收数据
  44.                 {
  45.                  if((++GetDataCounter)<7) //接收的数据计算器<数据长度 继续接收数据
  46.                         {
  47. //                                 GetDataCounter++;
  48.                            Getdata[GetDataCounter+1]=get_char;                       

  49.                         }
  50.                         else  //接收数据结束
  51.                         {
  52.                           Getdata[GetDataCounter+1]=get_char;        //接收最后一个数据       
  53.                                 GetDataCounter=0;               
  54.         GetFinish_flag=0;                               
  55.         State_flag=0x01;
  56.                                 while(SerialScreenData.ProcesDataClear_flag)
  57.                                 {
  58.                                  while(time_out--)
  59.                                          ;
  60.                                  SerialScreenData.WarnningCode=0x01;   //处理超时,接收数据丢失
  61.                                  break;
  62.                                 }
  63.         for(j=0;j<9;j++)
  64.          SerialScreenData.ProcesData[j]=Getdata[j];
  65.                                  SerialScreenData.Updata_flag=0x01;
  66.                         }
  67.                 }
  68.         }
  69. }
复制代码




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2019-3-15 08:26 | 显示全部楼层
来看看。。。
| 2019-3-17 17:52 | 显示全部楼层
支持楼主!
| 2019-3-18 17:25 | 显示全部楼层
支持楼主!!!
| 2019-3-20 20:32 | 显示全部楼层
飞扬自我 发表于 2019-3-10 17:39
无源和有源都有人用啊。看成本和精度要求以及工作环境等情况。

PCB板厂是哪家?推荐一下呗。

评论

飞扬自我 2019-3-21 22:05 回复TA
回复了,但是被管理员给灭了。。。你找这个***吧。胡蝶 135 1036 4750 
 楼主 | 2019-3-21 22:04 | 显示全部楼层
上几个测试的相片
布局画板的痛苦。



画原理图不能一心多用,一不小心就成了飞线了,,看左下角。


触摸屏的测试。。可惜没有留下测试的数据。










本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /3 下一条

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