OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3940|回复: 0

光耦码盘测速问题

[复制链接]

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2016-5-7
在线时间
41 小时
发表于 2017-3-15 22:12:11 | 显示全部楼层 |阅读模式
做的光耦码盘测速,网上你找的程序修改的,但是程序一直有问题,感觉是定时器和外部中断配置的有些问题,电机有一种想要转起来但是转不起来的样子,,请大神帮忙看看




#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); //显示时间”秒“的个位
        }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 21:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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