yankai123 发表于 2016-12-8 16:31:27

txrx

思念是种惩罚 发表于 2016-12-8 21:01:04

我电压表还没弄明白http://www.moz8.com//mobcent//app/data/phiz/default/02.png

我爱萝丽爱萝丽 发表于 2016-12-9 03:02:49

思念是种惩罚 发表于 2016-12-8 21:01
我电压表还没弄明白

哪里不明白?

我爱萝丽爱萝丽 发表于 2016-12-9 03:05:02

yankai123 发表于 2016-12-8 16:30
楼主   我给点关于 萝莉遥控的,意见。混控能改成开关混控 。就好了
...

现在三代控本来就可以随意映射通道、随意通道混控。
不明白你说的rx tx什么意思

独行者 发表于 2016-12-9 08:21:44

遥控好,老师辛苦,谢谢!

yankai123 发表于 2016-12-9 14:46:01

萝莉老师我的意思,通道混控 ,   一共就八个通道,    像apm混控   设置完    就没通道可用了。      意思   混控    能改成    开关混空这样   八个通道就不会   不够用了。
至于   txrx   我有点想法    就是数传   要是   能遥控端接触出数传   就好了

yankai123 发表于 2016-12-9 14:48:48

老师我就是有想法,就是 没技术   老崇拜你了。

一个人的世界 发表于 2016-12-9 14:50:39

支持楼主!

我爱萝丽爱萝丽 发表于 2016-12-10 03:22:14

yankai123 发表于 2016-12-9 14:46
萝莉老师我的意思,通道混控 ,   一共就八个通道,    像apm混控   设置完    就没通道可用了。       ...

你说的是六段开关吧,三代有这个功能。数传功能以后会有

我爱萝丽爱萝丽 发表于 2016-12-10 04:01:38

本帖最后由 我爱萝丽爱萝丽 于 2016-12-10 04:21 编辑

1.3 旋钮控制舵机


学到的知识更重要的是能灵活运用。在第十三课中学习的AD转换功能不仅可以测量电压,还能测出电位器旋转的角度。
旋转电位器时输出的电压会改变,用AD转换结果会0~255变化,正好可以用来控制PWM高电平的时间。


用电位器控制舵机的程序:
#include<reg51.h>

sfr P5=0xC8; //声明P5引脚寄存器
sfr P1ASF=0x9D;    //声明 P1口模拟功能寄存器
sfr ADC_RES=0xBD;//声明 ADC转换结果寄存器
sfr ADC_CONTR=0xBC;//声明 ADC控制寄存器

sbit OUT=P5^5;//定义一个输出引脚

unsigned int L; //定义一个数据
unsigned int adc;          //AD转换计算

void Delay10us()                //@12.000MHz
{
      unsigned char i;

      i = 27;
      while (--i);
}

void delay_n_10us(unsigned int n)//延时n个10us的函数
{
      while(n)         
      {
                Delay10us();
                n=n-1;//每循环一次n减小1
      }
}


void main()
{
      L=150;//1.5ms高电平,舵机摆到中间
      P1ASF=0x80;//设置P1.7引脚为模拟功能
      
      while(1)
      {
                OUT=1;
                delay_n_10us(L);//输出高电平
                OUT=0;
                delay_n_10us(1900);//19ms左右低电平
               
                ADC_CONTR=0x88+7;//开始P1.7引脚转换
                delay_n_10us(5);   //等待50us,AD转换完成
                adc=ADC_RES;//读取转换结果
               
                L=adc; //转动旋钮,adc的值0~255变化
                //L的变化范围是100~200,所以进行一下限制
                if(L>200)L=200; //高电平时间不能超过2ms
                if(L<100)L=100; //高电平时间不能低于1ms
      }
}

我爱萝丽爱萝丽 发表于 2016-12-10 05:31:13

1.4 组合数码管程序与舵机程序


如果只有一个旋钮,相当于你只DIY了一个市面价值6元的简易测试仪:



但如果你加了显示屏,那立马就上了档次,相当于30元的高端测试仪了





组合不同的程序功能,在每个项目里都会练习到。现在,你应该已经学会“系统周期法”。用这个方法,你应该马上想到:
数码管程序周期:4ms;
舵机程序周期:10us;
用最小的10us做为新程序的周期,你需要:
每400次(4ms)执行一次数码管;
每2000次(20ms)中,前100~200次(1~2ms)高电平,其余低电平。


这样,很轻松的就将两个简单的程序组合成一个复杂的程序。
学会这个方法,相当于你学会了一个“套路”,大部分程序你都可以这样套。赶快自己练习试试吧。
……………………………………………………
……………………………………………………


正如一道数学题有多种解法一样,“系统周期”也可以更灵活的分配。其实舵机只受高电平时间控制,至于低电平时间则并不关心。利用这个特性,可以将程序流程简化一下:
系统周期:4ms;
每4ms执行一次数码管;
每20ms执行一次输出高电平。1ms的时间很短,对显示来说没有影响。

#include<reg51.h>

sfr P5=0xC8; //声明P5引脚寄存器
sfr P2M0=0x96;   //声明 P2引脚模式寄存器
sfr P3M0=0xb2;   //声明 P3引脚模式寄存器
sfr P1ASF=0x9D;    //声明 P1口模拟功能寄存器
sfr ADC_RES=0xBD;//声明 ADC转换结果寄存器
sfr ADC_CONTR=0xBC;//声明 ADC控制寄存器

sbit DA=P2^4;                        //数码管每个引脚
sbit DB=P3^2;
sbit DC=P3^6;
sbit DD=P2^0;
sbit DE=P2^1;
sbit DF=P2^3;
sbit DG=P3^5;
sbit DP=P3^7;

sbit B1=P2^5;                        //四个数码管的引脚定义
sbit B2=P2^2;
sbit B3=P3^3;
sbit B4=P3^4;

sbit OUT=P5^5;//定义一个输出引脚



unsigned char display_time;        //定义变量用于显示次数

unsigned char Data1;        //第一个数码管要显示的数据
unsigned char Data2;        //第二个数码管要显示的数据
unsigned char Data3;        //第三个数码管要显示的数据
unsigned char Data4;        //第四个数码管要显示的数据

unsigned char count;        //计时
unsigned int adc;          //AD转换计算
unsigned int L; //高电平时间

void Delay10us()                //@12.000MHz
{
        unsigned char i;

        i = 27;
        while (--i);
}

void delay_n_10us(unsigned int n)//延时n个10us的函数
{
        while(n)         
        {
                Delay10us();
                n=n-1;//每循环一次n减小1
        }
}

void display(unsigned char x)//控制数码管显示内容的函数
{
        //判断x的值来决定显示什么
        if(x==0){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=0;DP=0;} //显示“0”       
        if(x==1){DA=0;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;} //显示“1”       
        if(x==2){DA=1;DB=1;DC=0;DD=1;DE=1;DF=0;DG=1;DP=0;} //显示“2”       
        if(x==3){DA=1;DB=1;DC=1;DD=1;DE=0;DF=0;DG=1;DP=0;} //显示“3”
        if(x==4){DA=0;DB=1;DC=1;DD=0;DE=0;DF=1;DG=1;DP=0;} //显示“4”       
        if(x==5){DA=1;DB=0;DC=1;DD=1;DE=0;DF=1;DG=1;DP=0;} //显示“5”       
        if(x==6){DA=1;DB=0;DC=1;DD=1;DE=1;DF=1;DG=1;DP=0;} //显示“6”       
        if(x==7){DA=1;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;} //显示“7”       
        if(x==8){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=1;DP=0;} //显示“8”       
        if(x==9){DA=1;DB=1;DC=1;DD=1;DE=0;DF=1;DG=1;DP=0;} //显示“9”
                                                       
        if(x==10){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=0;DP=1;} //显示“0”带小数点       
        if(x==11){DA=0;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=1;} //显示“1”带小数点       
        if(x==12){DA=1;DB=1;DC=0;DD=1;DE=1;DF=0;DG=1;DP=1;} //显示“2”带小数点       
        if(x==13){DA=1;DB=1;DC=1;DD=1;DE=0;DF=0;DG=1;DP=1;} //显示“3”带小数点
        if(x==14){DA=0;DB=1;DC=1;DD=0;DE=0;DF=1;DG=1;DP=1;} //显示“4”带小数点       
        if(x==15){DA=1;DB=0;DC=1;DD=1;DE=0;DF=1;DG=1;DP=1;} //显示“5”带小数点       
        if(x==16){DA=1;DB=0;DC=1;DD=1;DE=1;DF=1;DG=1;DP=1;} //显示“6”带小数点
        if(x==17){DA=1;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=1;} //显示“7”带小数点       
        if(x==18){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=1;DP=1;} //显示“8”带小数点
        if(x==19){DA=1;DB=1;DC=1;DD=1;DE=0;DF=1;DG=1;DP=1;} //显示“9”带小数点
}

void main()
{
        P2M0=0x1B;                //需要高电平大电流的引脚 2.4、2.3、2.1、2.0,填入数值0001 1011
        P3M0=0xE4;                //需要高电平大电流的引脚 3.7、3.6、3.5、3.2,填入数值1110 0100
        P1ASF=0x80;//设置P1.7引脚为模拟功能
       
        while(1)
        {
                delay_n_10us(400);//系统周期4ms
               
                count=count+1;
                if(count>4)//每20ms秒插入一次高电平
                {
                        count=0;
                        B1=1;B2=1;B3=1;B4=1;//暂时关闭数码管,避免闪烁
                       
                        ADC_CONTR=0x88+7;//开始P1.7引脚转换
                        delay_n_10us(5);   //等待50us,AD转换完成
                        adc=ADC_RES;//读取转换结果
                       
                        L=adc; //转动旋钮,adc的值0~255变化
                        //L的变化范围是100~200,所以进行一下限制
                        if(L>200)L=200; //高电平时间不能超过2ms
                        if(L<100)L=100; //高电平时间不能低于1ms
                       
                        OUT=1;
                        delay_n_10us(L);//输出1~2ms高电平
                        OUT=0;//其他时间为低电平
                       
                        //显示L的大小
                        Data1=0;
                        Data2=L/100;          //百位数据
                        Data2=Data2+10;   //加10,display函数显示的数字会带小数点
                       
                        Data3=L%100/10; //十位数据                       
                        Data4=L%10;   //个位数据       
                }
               
               
               
                ///////////////////////////////////////////////////////
                //显示程序模块化,只需要改变Data1/2/3/4的值就可以控制显示内容
               
                display_time=display_time+1;
                if(display_time>3)
                {
                        display_time=0;//0、1、2、3 四个循环
                }
               
                if(display_time==0)//第0次显示第一个数码管
                {
                        B1=0;B2=1;B3=1;B4=1;       
                        display(Data1);                //显示第1位数据
                }
               
                if(display_time==1)//第1次显示第二个数码管
                {
                        B1=1;B2=0;B3=1;B4=1;       
                        display(Data2);                //显示第2位数据
                }
               
                if(display_time==2)//第2次显示第三个数码管
                {
                        B1=1;B2=1;B3=0;B4=1;       
                        display(Data3);                //显示第3位数据
                }
               
                if(display_time==3)//第3次显示第四个数码管
                {
                        B1=1;B2=1;B3=1;B4=0;       
                        display(Data4);                //显示第4位数据
                }
        }
}


独行者 发表于 2016-12-10 08:48:09

学习了,谢谢老师!

815023524 发表于 2016-12-10 09:12:01

楼主天天都熬夜,真是太辛苦了

我是天才 发表于 2016-12-10 17:58:11

楼主,舵机测试仪有了,下一个教程就弄一个关于有刷电调的吧,

yankai123 发表于 2016-12-10 22:53:14

我爱萝丽爱萝丽 发表于 2016-12-10 03:22 static/image/common/back.gif
你说的是六段开关吧,三代有这个功能。数传功能以后会有

混控里面,   是通道在混控   如果像天地飞   可以开关   混.控的话,通道    就够用了。不然像我的设置玩混控   ,就一个通道可以用了,我设置了旋钮控制云台俯仰。起落架, 就没通道控制。   

yankai123 发表于 2016-12-10 22:55:17

我爱萝丽爱萝丽 发表于 2016-12-10 03:22 static/image/common/back.gif
你说的是六段开关吧,三代有这个功能。数传功能以后会有

期待    可以接出   数传, 这样   距离就很远了   。433100mw距离太近。功率大有太贵

行云流水 发表于 2016-12-10 23:17:09

楼主,辛苦了。

0疯子0 发表于 2016-12-11 00:42:29

顶贴是一种美德

我爱萝丽爱萝丽 发表于 2016-12-11 05:29:45

本帖最后由 我爱萝丽爱萝丽 于 2016-12-11 05:35 编辑

1.5 项目扩展


作为一个实用的项目,自然不能随便做一做就行。在这个项目中,还存在一个问题:输出的高电平时间不是准确的1ms,而是1.1ms。


关于精确延时,在《红外遥控》章节中有过讲述。当延时时间达到微秒级时,就会不太准确,需要手动调整。
由于循环程序也会占用时间,明显执行一次delay10us不是10us,而是11us。
当然,精确调整需要示波器、逻辑分析仪才行,普通学习者没有条件,这里给出一个调整好的:
void Delay10us()                //@12.000MHz
{
      unsigned char i;
      
      _nop_();
      _nop_();//调整过
      i = 24;
      while (--i);
}

void delay_n_10us(unsigned int n)//延时n个10us的函数
{
      while(n) //while会占用时间,所以调小delay10us      
      {
                Delay10us();
                n=n-1;//每循环一次n减小1
      }
}



除了使信号输出更精确,作为一款有“显示屏”的产品,搭配上按键,你就可以切换多种模式,实现丰富的功能!这样它就不单单是一个舵机测试仪了,而是一个多功能的小助手。
在你学会了更多知识以后,它可以变成电压电流表、转速表、温度湿度表、电机调速器等等。
现在,你就可以先试着增加一个按键,集成电压测量的功能?

sefesaqi 发表于 2016-12-11 11:34:23

真是实用的技术贴,楼主写的非常好。
页: 1 2 [3] 4 5 6 7
查看完整版本: 第十四课:制作舵机测试仪