搜索
bottom↓
回复: 0

光耦码盘测速问题

[复制链接]

出0入0汤圆

发表于 2017-3-15 22:08:47 | 显示全部楼层 |阅读模式
做的光耦码盘测速,网上你找的程序修改的,但是程序一直有问题,感觉是定时器和外部中断配置的有些问题,电机有一种想要转起来但是转不起来的样子,,请大神帮忙看看


#include        <reg52.h>
#include    <intrins.h>
#include        "motor.h"
#include        "1602.h"

sbit         RIGHT_IN1 =        P1^3;          //右边电机
sbit        RIGHT_EN  =        P1^4;
sbit        RIGHT_IN2 =        P1^5;
                                                  
sbit         LEFT_IN1 =        P1^2;    //左边电机
sbit        LEFT_EN  =        P1^1;
sbit        LEFT_IN2 =        P1^0;
sbit         GUANGOU=P3^2;  //光耦

#define PWM_PERIOD  100     //PWM周期PWM_PERIOD*100us

#define uchar        unsigned char
#define        uint        unsigned int
//---------- PWM ------------//
uchar        PWM_COUNTER = 0;      //pwm产生周期 100*100us
uchar        LEFT_PWM_DUTY  = 50;  //左边电机占空比
uchar        RIGHT_PWM_DUTY = 50;  //右边电机占空比
uint  speed,qian,bai,shi,ge,n;
/*********************************************
函数名称: Delay_10Us
函数功能: us延时函数
函数输入: us-延时时间控制变量
函数输出: 无
**********************************************/
void Delay_10Us(uint us)
{
        while( us-- );
}

/*********************************************
函数名称: DelayMs
函数功能: ms级延时函数,延时时间:ms*ms
函数输入: ms-延时时间控制变量
函数输出: 无
**********************************************/
void DelayMs(uint ms)
{
        unsigned int i,j;
        for( i = 0; i < ms; i ++ )
                for( j = 115; j > 0; j --);
}
/*********************************************
函数名称: Init
函数功能: 初始化单片机的定时0(用于产生PWM)、定时器1(用于产生时钟)
函数输入: 无
函数输出: 无
**********************************************/
void Init_Timer(void)
{
  TMOD = 0x12;             //设定T0的工作模式为2,设定T0的工作模式为1
   //----装入定时器初值 -----//
   TH0 = 0x95;              //100us定时
   TL0 = 0x95;       
   TH1 = (65536-50000)/256; //50ms定时            
   TL1 = (65536-50000)%256;

   IT0 = 1;
   IP  = 0x03;
   EA  = 1;                 // 开总中断
   ET0 = 1;                 // 定时器0允许中断
   ET1 = 1;                 // 定时器1允许中断
   TR1 = 1;                 // 启动定时器1
   TR0 = 1;                 // 启动定时器0
}
/*********************************************
函数名称: Timer0_ISR
函数功能: 定时器0中断服务函数,用于输出PWM波
函数输入: 无
函数输出: 无
**********************************************/
void Timer0_ISR(void) interrupt        1 using 1
{
        PWM_COUNTER ++;
        if(PWM_COUNTER < PWM_PERIOD)
        {
                if(PWM_COUNTER > LEFT_PWM_DUTY)         LEFT_EN  = 0;
                if(PWM_COUNTER > RIGHT_PWM_DUTY) RIGHT_EN = 0;
        }
        else
        {
                PWM_COUNTER = 0;       
                LEFT_EN  = 1;
                RIGHT_EN = 1;
        }
}
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{
  n++;
  while(GUANGOU==0);
}

/*********************************************
函数名称: Timer1_ISR
函数功能: 定时器1中断服务函数,用于产生时钟
函数输入: 无
函数输出: 无
**********************************************/
void Timer1_ISR() interrupt 3      
{
    uchar cnt;
         cnt=cnt+1;
         if(GUANGOU==1)n++;
         if(cnt==100)
           {
              cnt=0;
                  speed=20*n;
                  n = 0;
                  qian=speed/1000;
                  bai=speed%1000/100;
                  shi=speed%100/10;
                  ge=speed%10;  
    }
          TH1=(65536-10000)/256;
          TL1=(65536-10000)%256;
}

/*********************************************
函数名称: GoHead
函数功能: 前进函数:控制小车以一定速度直线前进,也可以
           控制小车转弯
函数输入: speed_left -左轮占空比
           speed_right-右轮占空比
函数输出: 无
**********************************************/
void GoHead(uchar speed_left,uchar speed_right)
{
        LEFT_IN1  = 0;
        LEFT_IN2  = 1;

        RIGHT_IN1 =        0;
        RIGHT_IN2 =        1;
        LEFT_PWM_DUTY  = speed_left;
        RIGHT_PWM_DUTY = speed_right*5/4;  //走直线占空比校正
}
/********************************************
函数名称: main
函数功能: 整个程序的入口
函数输入: 无
函数输出: 无
**********************************************/
void main(void)
{
        LcdReset();                //液晶初始化
        Init_Timer();       //Timer0、Timer1初始化
    DisplayListChar(0,0,"speed",5);   
    DisplayListChar(0,1,"CUG ROBOT TEAM",14);
    EA=1;   //开放总中断
    EX0=1;  //允许使用外中断
    IT0=1;  //选择负跳变来触发外中断
        while(1)
        {
                GoHead(40,60);
            DispOneChar(6,0,qian+0x30); //显示时间”分“的十位
        DispOneChar(7,0,bai+0x30); //显示时间”分“的个位
        DispOneChar(8,0,shi+0x30); //显示时间”秒“的十位
        DispOneChar(9,0,ge+0x30); //显示时间”秒“的个位
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 07:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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