找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10199|回复: 19
打印 上一主题 下一主题
收起左侧

自制标签送料器

[复制链接]
跳转到指定楼层
楼主
此制作是用的步进电机, 也可以用直流电机加Ad,用起来还不错,有点噪音。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:66032 发表于 2014-9-30 08:51 | 只看该作者
source code
/**********************************************************/
/* PIC18F4620 ????: 1?42 6???????, 1?L298N????,2??????AD?? */
/* 1??????????? */
#include <pic18.h>   
__PROG_CONFIG(1,0xc200);
__PROG_CONFIG(2,0x001e);
__PROG_CONFIG(3,0x0100);
__PROG_CONFIG(4,0x0081);
__PROG_CONFIG(5,0xc00f);
__PROG_CONFIG(6,0xe00f);
__PROG_CONFIG(7,0x400f);

#define uchar unsigned char
#define uint unsigned int
#define seg1 PORTAbits.RA2
#define seg2 PORTAbits.RA3
#define seg3 PORTAbits.RA4
#define seg4 PORTAbits.RA5
#define reset_check PORTEbits.RE0//pull-up with a 4.7K res to Vcc
#define count_clr PORTEbits.RE1//pull-up with a 4.7K res to Vcc

const uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
const uchar coil_active[]={0x01,0x05,0x04,0x06,0x02,0x0a,0x08,0x09};

static uchar wait_t=0,speed=100;
uint count;
uchar num0,num1,num2,num3;

void delay(uint z);
void Port_init(void);
void display(void);
void EEPROM_write(uchar wr_data,uchar wr_addr);
void timer0_init(void);
uchar EEPROM_read(uchar addr);
void forward(void);
void hyst_forward(void);

void main()
{
uint temp1,temp2;
Port_init();
timer0_init();
delay(10);
temp1=EEPROM_read(0x01);//Æô¶ˉ¶áè¡éÏò»′Îê1óñêÇ©μÄêy¾Y£»
temp2=EEPROM_read(0x02);//Æô¶ˉ¶áè¡éÏò»′Îê1óñêÇ©μÄêy¾Y£»
count=temp1*256+temp2;
while(1)
{
     display();
     if (reset_check==0)
        {
            delay(10);
            if(reset_check==0)
             {  
                        count++;
                    hyst_forward();
                    EEPROM_write(count/256,0x01);
                    EEPROM_write(count%256,0x02);
                    if(count==10000)
                        count=0;
                    while(!reset_check);
              }
         }
     else
        forward();
    if (count_clr==0)
     {
        delay(10);
        if (count_clr==0)
          {
            count=0;
            EEPROM_write(0,0x01);//clear the data from E2PROM
            EEPROM_write(0,0x02);//clear the data from E2PROM
          }
     }
}

}

void delay(uint z)
{
  uint x,y;
  for(x=0;x<z;x++)
  for(y=0;y<10;y++);
}

void Port_init(void)
{
   TRISA=0x03;
   ADCON1=0x0D;//select AN0&AN1 as analog input channel;
   ADCON2=0x3A;//left justified, 20Tad, Tosc/32;
   TRISD=0x00;
   PORTD=0xff;//Numerical LED scanning;
   TRISC=0x00;//Step-Motor winding power-up;
   PORTC=0x00;
   TRISE=0x07;//set the PORTE as input I/O;
}

void timer0_init(void)
{
   INTCON=0xE0;//GIE, PEIE and timer0 overflow interrupt;
   T0CON=0x08;
   TMR0H=(65535-1000)/256; //set the time to be 1ms;
   TMR0L=(65535-1000)%256;  //set the time to be 1ms;
   TMR0ON=1;
}


void display(void)
{
   num0=count/1000;
   num1=count%1000/100;
   num2=count%100/10;
   num3=count%10;

   PORTD=table[num0];
   seg1=0;
   delay(10);
   seg1=1;
   PORTD=table[num1];
   seg2=0;
   delay(10);
   seg2=1;
   PORTD=table[num2];
   seg3=0;
   delay(10);
   seg3=1;
   PORTD=table[num3];
   seg4=0;
   delay(10);
   seg4=1;

}
void EEPROM_write(uchar wr_data,uchar wr_addr)
{
    GIE=0;  
    EEIF=0;
    EEADR=wr_addr;
    EEDATA=wr_data;
    EECON1bits.EEPGD=0;//
    EECON1bits.CFGS=0;//
    EECON1bits.WREN=1;
    EECON2=0x55;
    EECON2=0xaa;
    EECON1bits.WR=1;
    while(!EEIF);
    PIR2bits.EEIF=0;
    EECON1bits.WREN=0;
    GIE=1;
}

uchar EEPROM_read(uchar addr)
{   
    uchar temp;
    EEADR=addr;
    EECON1bits.EEPGD=0;
    EECON1bits.CFGS=0;
    EECON1bits.RD=1;
   // asm("NOP");
    temp=EEDATA;
    while(EECON1bits.RD);
    return temp;
}

void forward(void)
{
    static uchar j;
    for (j=0; j<8; j++)
     {
          PORTC=coil_active[j];
          delay(5);
          PORTC=0xff;
          delay(speed);   
          PORTC=coil_active[j];
          delay(5);
          PORTC=0xff;
          delay(speed);   
          PORTC=coil_active[j];
          delay(5);
          PORTC=0xff;
          delay(speed);  
          PORTC=coil_active[j];
          delay(5);
          PORTC=0xff;
          delay(speed);   
          PORTC=coil_active[j];
          delay(5);
          PORTC=0xff;
          delay(speed);            
     }
}
//*μ±¼ì2éμĸ′λDÅoÅo󣬡¡Ñóê±ò»¶Îê±¼äèñêÇ©íÑàë¾íÖ½£¬Â¶3öà′òÔ±ã2ù×÷Ô±ÄÃè¡£a£ˉ/
void hyst_forward(void)
{   
    static uchar j;
     while(wait_t--)
       {
        for (j=0; j<8; j++)
         {
              PORTC=coil_active[j];
              delay(5);
              PORTC=0xff;
              delay(speed);
              PORTC=coil_active[j];
              delay(5);
              PORTC=0xff;
              delay(speed);
              PORTC=coil_active[j];
              delay(50);
              PORTC=0xff;
              delay(speed);
              PORTC=coil_active[j];
              delay(5);
              PORTC=0xff;
              delay(speed);
              PORTC=coil_active[j];
              delay(5);
              PORTC=0xff;
              delay(speed);                 
         }            
     }
}

void interrupt timer0()//continous check if the speed & wait_t are changed
{  
   
    uchar i,count1;
    uint adval,sum=0;
    if (TMR0IF==1)
    {
        TMR0IF=0;
        TMR0ON=0;
        TMR0H=(65535-1000)/256; //set the time to be 1ms;
        TMR0L=(65535-1000)%256; //set the time to be 1ms;
        TMR0ON=1;
        count1++;
        if (count1==3)
         {
            for (i=0;i<10;i++)//sampling 10 times to get the stable data;
             {
                   ADCON0=0x00; //convert AN0 channel;
                   asm("NOP"); asm("NOP");asm("NOP");
                   GO=1;
                   while(GO);
                   adval=ADRESH;
               sum+=adval;
                   speed=(int)sum/10/10;//due to dalay()routine, this needs to be divided by 10;
            }   
                     
        }
         
        if (count1==6)
         {
            count1=0;
            for (i=0;i<10;i++)//sampling 10 times to get the stable data;
             {
                    ADCON0=0x04;//convert AN1 channel;
                    asm("NOP"); asm("NOP");asm("NOP");
                    GO=1;
                    while(GO);
                    adval=ADRESH;
                sum+=adval;
                    wait_t=(int)sum/10/2;//upon this actual operation;
            }
         }      
   }
}


回复

使用道具 举报

板凳
ID:66032 发表于 2014-9-30 08:59 | 只看该作者

回复

使用道具 举报

地板
ID:51090 发表于 2014-9-30 13:02 | 只看该作者
大神级别的作品啊  学习了
回复

使用道具 举报

5#
ID:26188 发表于 2014-9-30 13:30 | 只看该作者
佩服啊 换个壳子的话 就可以量产做产品了  应该有销路的.
回复

使用道具 举报

6#
ID:1 发表于 2014-9-30 14:53 | 只看该作者
好东西  ,楼主能上传个电路图吗?
回复

使用道具 举报

7#
ID:66032 发表于 2014-9-30 17:13 | 只看该作者
Label feeder

im4511_20140930_015235.pdf

27.35 KB, 下载次数: 37, 下载积分: 黑币 -5

回复

使用道具 举报

8#
ID:19715 发表于 2014-10-1 10:15 | 只看该作者
非常有水平,做得挺牛
建议楼上跟中央台《我爱发明》栏目联系,会优先采纳。
回复

使用道具 举报

9#
ID:19715 发表于 2014-10-1 10:17 | 只看该作者
本帖最后由 明白 于 2014-10-1 11:13 编辑

步进电机速度高了,噪音挺大
机器用来干什么的?

先占个位!请楼主讲解一下是干吗的!



回复

使用道具 举报

10#
ID:66032 发表于 2014-10-1 11:12 | 只看该作者
用来贴产品的标签,每次员工值接用一只手就可以贴标签了, 没有这个势必要用两只手,相当于解放一只手拿产品做别的事,效率提高了,下一步,我打算用直流带减速器马达, 用PWM+AD来改变占空比控制,这样电路更简洁,程序更优化,我查了下,淘宝上卖的都是这种设计,我准备做个5台给生产线试用
回复

使用道具 举报

11#
ID:19715 发表于 2014-10-1 11:16 | 只看该作者
mqwu 发表于 2014-10-1 11:12
用来贴产品的标签,每次员工值接用一只手就可以贴标签了, 没有这个势必要用两只手,相当于解放一只手拿产 ...

兄弟你太有才了,不得不佩服,这样具有学习能力的单片机大有前途呀。
回复

使用道具 举报

12#
ID:19715 发表于 2014-10-1 11:19 | 只看该作者
底下那个传感器是用来检测标签到位吗
回复

使用道具 举报

13#
ID:66032 发表于 2014-10-1 11:38 | 只看该作者
是的,你说的非常正确
回复

使用道具 举报

14#
ID:66032 发表于 2014-10-1 12:27 | 只看该作者
其实理工男蛮苦的,整天面对电子元件和电脑,较尽脑汁做一些屌丝们都不愿意做的事,也没有楼上你说的那么有才, 只是忘掉世俗的浮躁和唯物拜金,做一点自己喜欢的事情罢了。同时也为了能够生存混口饭吃,就这么简单。
回复

使用道具 举报

15#
ID:19715 发表于 2014-10-1 12:49 | 只看该作者
当运行EEPROM_write();时,
对数码管显示,步进电机有影响吗
回复

使用道具 举报

16#
ID:66032 发表于 2014-10-1 13:03 | 只看该作者
没有影响,因为PIC18系列运行一个指令周期很短,只要4个时钟周期,你若用4M的晶振, 也就需要1uS,而数码管的动态扫描用的delay(10),就相当于10x10uS,远比E2PROM写和读长。
回复

使用道具 举报

17#
ID:28571 发表于 2015-4-16 19:59 | 只看该作者
非常好东西,学习一下!
回复

使用道具 举报

18#
ID:409674 发表于 2018-10-22 01:07 来自手机 | 只看该作者
mqwu 发表于 2014-10-1 11:12
用来贴产品的标签,每次员工值接用一只手就可以贴标签了, 没有这个势必要用两只手,相当于解放一只手拿产 ...

请教下,如何控制直流马达停止及圈数?
回复

使用道具 举报

19#
ID:399179 发表于 2018-10-22 19:23 来自手机 | 只看该作者
楼主牛人,学习了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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