免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1911 | 回复: 0
打印 上一主题 下一主题

计度器驱动 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-25 10:07 |只看该作者 |倒序浏览
我现在在写一个计度器驱动程序,用的是“JD型机电脉冲计度器,规格100脉冲/千瓦.时”,与NEC的uPD78F9222单片机的2个端口直连。我写的几个驱动程序烧写入单片机,上电后计度器要么一次转2小格,要么干脆不转。做了无数次实验就没了现一次走1小格的情况。对着计度器我都欲哭无泪了。那位懂计度器驱动的高手帮忙指点下,到底怎么样的时序才能让计度器走1小格啊
计度器不走的程序如下,用的是NEC的uPD78F9222单片机
#pragma SFR
#pragma DI
#pragma EI
#pragma NOP
#pragma interrupt  INTTM000  ISR_275ms //中断入口

unsigned char flag_M=0;
/****************************************************************/
void Init_CPU()   //初始化
{

    PCC=0;                  
    PPCC=0;
    LSRCM = 0x00;
    //
    PM4.2=0;
    PM4.0=0;
    PU4.2=0;
    PU4.0=0;
    //
    WDTM = 0x67;                                                                                                            
   
}
/**********************************************************/
void delay(unsigned int n)  //delay 10ms
{
unsigned int i;
for(i=0;i<80*n;i++);
}
/****************************************************************/
void Init_275ms()  //定时器定时275ms
{
    //
    P4.2=0;
    P4.0=0;

        // 定时器初始化
    CRC00=0x00;
    PRM00=0xA2;
CR000=0x2191;
//定时器中断初始化
    TMMK000=1;
    TMIF000=0;
    TMMK000=0;       
}

/******************************************************************/
void ISR_275ms(void)  //中断服务程序
{
  TMC00=0x00; //关定时器
  if(flag_M==1)P4.2=0;
  if(flag_M==2){P4.0=0;flag_M=0;}
}

/******************************************************************/
void motor()
{
  flag_M++;
  TMC00=0x04; //开定时器
  
  if(flag_M==1)P4.2=1;
  if(flag_M==2)P4.0=1;

   
}
/********************************************************************/  
void main(void)
{
  DI();
  Init_CPU();
  Init_275ms();
  EI();
  while(1)
       {
         motor();
         delay(200); //延时约2 S
        }
}
用软件模拟,P4.2,P4.0出的脉冲如下,延时约2秒的时间可看做是单片机计数的工作时间
        

这个程序烧入单片机,计度器里有响动的声音,但就是不转。
另外软件模拟,转2小格P4.2,P4.0出的脉冲的时序图如下,其中144ms高改为275ms,间隔347ms改为367ms也是一样的,一次转2小格。

程序如下:

#pragma SFR
#pragma DI
#pragma EI
#pragma NOP
#pragma interrupt INTTM000 ISR_F1  //CR000中断入口
#pragma interrupt INTTM010 ISR_F2  //CR010中断入口

unsigned char  flag_F2=0; //标志
/****************************************************************/
void Init_CPU()  //MCU初始华
{

    PCC=0;                  
    PPCC=0;
    LSRCM = 0x00;
    //
    PM4.2=0;  //输出方式
    PM4.0=0;
    PU4.2=0;  //不接上拉电阻
    PU4.0=0;
    //
    WDTM = 0x67;                                                                                                            
   
}
/******************************************************************/
void delay(unsigned int n)// 延时10ms
{
unsigned int i;
for(i=0;i<80*n;i++);
}
/****************************************************************/
void Init_round()
{
    //
    P4.2=0;
    P4.0=0;

        //
    CRC00=0x00;
    PRM00=0xA2;
    CR000=0x1194;  //定时器CR000寄存器初值144ms
    CR010=0x2A5B;  //定时器CR010寄存器初值347ms
    //
    TMMK000=1;  //中断屏蔽
    TMMK010=1;
    TMIF000=0;  //清中断标志
    TMIF010=0;
    TMMK000=0;  //中断屏蔽开
    TMMK010=0;
    //
       
}

/******************************************************************/
void ISR_F1(void)  //CR000中断服务
{
        P4.2=0;       
}

void ISR_F2(void)  //CR010中断服务
{
    flag_F2++;
    //
        if(flag_F2==1)
          {
            P4.0=1;
            TMMK000=1;  //CR000中断屏蔽
            TMC00=0x00;  //定时器关
            CR010=0x1194;  // CR010寄存器重赋初值144ms
            TMC00=0x04;  //定时器开
            }
        if(flag_F2==2)
          {
       
            P4.0=0;
            flag_F2=0;
            TMMK000=0; // CR000 中断屏蔽开
            TMC00=0x00;
            CR000=0x1194;  //144ms
        CR010=0x2A5B;  //347ms             
          }
}
/******************************************************************/
void motor()
{
  TMC00=0x04;  //定时器开
  P4.2=1;  
}
/********************************************************************/  
void main(void)
{
  DI();
  Init_CPU();
  Init_round();
  EI();
  while(1)
  {  
     motor();
     delay(200);  //延时2S  
  }
   
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP