搜索
bottom↓
回复: 8

求助-51单片机-PWM-蓝牙控制-小车电机调速问题

[复制链接]

出0入0汤圆

发表于 2014-3-17 22:33:54 | 显示全部楼层 |阅读模式
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit YF  = P1^0;
sbit YZ  = P1^1;
sbit ZZ  = P1^2;
sbit ZF  = P1^3;
bit flag1,flag2,temp;

void right();
void left();
void speed();
void slow();
void start();
void stop();
//void back();

uchar dat,ZKB1,ZKB2;

void init()
{
        TMOD = 0x21;
        TH0 = 0xFF;
        TL0 = 0xA0;
        ET0 = 1;
        TR0 = 1;
        ES = 1;
//        IP = 0x10;
        SCON =0x50;
        TH1 = 0XFD;
        TL1 = 0XFD;
        EA  = 1;
        TR1 = 1;
        ET1 = 1;
        flag1 = flag2 = 0;
        ZZ = ZF = YZ = YF = 0;
}
void main()
{
        init();
        while(1)
        {

        }
}

void start()
{ZKB1 = 50;ZKB2 = 50;}

void stop()
{ZKB1 = 0; ZKB2 = 0; }

void speed()
{
        ZKB1 += 10;
        ZKB2 += 10;
        if(ZKB1 >= 100){ZKB1 = 100;}
        if(ZKB2 >= 100){ZKB2 = 100;}
}

void slow()
{
        ZKB1 -= 10;
        ZKB2 -= 10;
        if(ZKB1 <= 0){ZKB1 = 0;}
        if(ZKB2 <= 0){ZKB2 = 0;}
}

void left()
{
        if(!flag1){ZKB1 = ZKB1 - 30;ZKB2 = ZKB2 + 20;flag1 = ~flag1;}
        if(flag1) {ZKB1 = ZKB1 + 30;ZKB2 = ZKB2 - 20;flag1 = ~flag1;}       
}

void right()
{
        if(!flag2){ZKB2 = ZKB2 - 30;ZKB1 = ZKB1 + 20;flag2 = ~flag2;}
        if(flag2) {ZKB2 = ZKB2 + 30;ZKB1 = ZKB1 - 20;flag2 = ~flag2;}       
}

void uart_ISR() interrupt 4
{
        RI = 0;
        dat = SBUF;       
                switch(dat)
                {
                        case 0xAA: speed();break;
                        case 0xBB: slow();break;
        //                case 0xCC: back();break;
                        case 0xDD: left();break;
                        case 0xEE: right();break;               
                        case 0xFF: start();break;
                        default :  stop();break;
                }
}

void timer0() interrupt 1
{
        static uchar count = 0;
        TH0 = 0xFF;
        TL0 = 0xA0;
        ++count;
        if(count > 100){count = 0;}

        if(count < ZKB1)
                ZZ = 1;
        else ZZ = 0;               
        if(count < ZKB2)
                YZ = 1;
        else YZ = 0;

}

我是用蓝牙串口通信控制51单片机小车的电机调速。
现在的问题是,先发送0XFF,执行Start()后,两个占空比都设置为50,再发送一个字节的0XAA后,ZKB1与ZKB2不是变为 60 60 小车效果是直接速度变为最大,无法实现调速。
Start() 后再按slow() 同样无法减速,只是占空比变高了一点。

感觉程序就这么点了,还是无法看出自己的问题,请大家帮我看下我到底哪里出了问题了 = =!

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-3-18 01:47:21 | 显示全部楼层
帮你顶一下,免得沉下去。我讲一下,也许不对。你确定你按发射后,只执行一次吗?要是被执行了多次呢?还有那个slow的uchar变量怎么会小于0?

出0入0汤圆

发表于 2014-3-18 01:55:32 | 显示全部楼层
再看了半天,你这个方案,为什么不直接用蓝牙送两个电机的速度量,上位机想改就改,控制还方便。

出0入0汤圆

 楼主| 发表于 2014-3-18 10:18:53 | 显示全部楼层
weijia 发表于 2014-3-18 01:55
再看了半天,你这个方案,为什么不直接用蓝牙送两个电机的速度量,上位机想改就改,控制还方便。 ...

感谢回复~~      
发送数据时,可以看到电脑串口助手  一次发出的是一个字节的数据。
我是想用上位机的几个按键实现小车的前进   加速  减速   左转  右转  后退等方向控制。

您说直接用蓝牙发送速度值来控制吗,怎么样做呀。我是想通过蓝牙发送数据改变占空比(ZKB1 ZKB2)来间接地改变小车的速度。  

出0入0汤圆

 楼主| 发表于 2014-3-18 10:21:50 | 显示全部楼层
weijia 发表于 2014-3-18 01:47
帮你顶一下,免得沉下去。我讲一下,也许不对。你确定你按发射后,只执行一次吗?要是被执行了多次呢?还有那 ...

uchar 这个地方是我编写错误没有注意,感谢提醒

一个小问题哈,这里
void slow()
{
        ZKB1 -= 10;
        ZKB2 -= 10;
        if(ZKB1 <= 0){ZKB1 = 0;}
        if(ZKB2 <= 0){ZKB2 = 0;}
}
如果ZKB1 ZKB2减到0后,再执行一次就会出错吧,程序会怎么处理呢。  

出0入0汤圆

发表于 2014-3-18 12:30:50 | 显示全部楼层
LTREE 发表于 2014-3-18 10:21
uchar 这个地方是我编写错误没有注意,感谢提醒  

一个小问题哈,这里

if(n>=10) n-=10; // 一句搞定

出0入0汤圆

发表于 2014-3-18 12:40:55 | 显示全部楼层
LTREE 发表于 2014-3-18 10:18
感谢回复~~      
发送数据时,可以看到电脑串口助手  一次发出的是一个字节的数据。
我是想用上位机的 ...

我就是说 你可以 让上位机 直接送 ZKB1 ZKB2 两个数啊,这些什么前后左右的,都在上位机实现,不还方便操作一些。

大概下面这个意思。上位机把ZKB1处理一下, ZKB1 |=0x80; 这样就没有什么 其它的指令了。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit YF  = P1^0;
sbit YZ  = P1^1;
sbit ZZ  = P1^2;
sbit ZF  = P1^3;

uchar dat,ZKB1,ZKB2;

void init()
{
        TMOD = 0x21;
        TH0 = 0xFF;
        TL0 = 0xA0;
        ET0 = 1;
        TR0 = 1;
        ES = 1;
//        IP = 0x10;
        SCON =0x50;
        TH1 = 0XFD;
        TL1 = 0XFD;
        EA  = 1;
        TR1 = 1;
        ET1 = 1;
        flag1 = flag2 = 0;
        ZZ = ZF = YZ = YF = 0;
}
void main()
{
        init();
        while(1)
        {

        }
}

void uart_ISR() interrupt 4
{
        RI = 0;
        dat = SBUF;      
        
        if(dat >100) ZKB1 = dat & 0x7f;
        else  ZKB2 = dat;
}

void timer0() interrupt 1
{
        static uchar count = 0;
        TH0 = 0xFF;
        TL0 = 0xA0;
        ++count;
        if(count > 100){count = 0;}

        if(count < ZKB1)
                ZZ = 1;
        else ZZ = 0;               
        if(count < ZKB2)
                YZ = 1;
        else YZ = 0;

}

出0入0汤圆

 楼主| 发表于 2014-3-18 12:41:35 | 显示全部楼层
weijia 发表于 2014-3-18 12:30
if(n>=10) n-=10; // 一句搞定

en       酱紫可以。

我暂时就设定占空比调速了。不实现分级加速 减速了。

THANK YOU

出0入0汤圆

 楼主| 发表于 2014-3-18 12:43:43 | 显示全部楼层
weijia 发表于 2014-3-18 12:40
我就是说 你可以 让上位机 直接送 ZKB1 ZKB2 两个数啊,这些什么前后左右的,都在上位机实现,不还方便操 ...

咦     我咋没想到这样子  哈哈     下次试下    先整合下自己的几个程序     


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

本版积分规则

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

GMT+8, 2024-8-26 13:18

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

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