新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 航模遙控器改裝---PPM波形產生

        航模遙控器改裝---PPM波形產生

        作者: 時間:2016-11-18 來源:網絡 收藏
        最近接觸航模,很有興趣,拆了一個航模遙控器,準備改裝下。對航模不太了解,首先從遙控入手,需要了解輸出信號,可以用遙控器結合電腦的模擬軟件來練習調試。首先用好的遙控器來測試輸出的PPM波形,連續的發射波形和部分波形如下圖所示:


        于是用單片機編寫了一個同樣的波形,6通道的PPM波形,一個周期的總時間20ms,6個PPM波形,高電平每個波形最大1.4ms,最小0.6ms,低電平固定0.4ms。

        臨時焊接了一個電路,比較丑,哈哈,但是效果還是可以的。

        根據遙控器內部空間結構,昨天剛畫完整的PCB板子,主控單片機換成了PIC16F917,無線遙控模塊先用NRF2401測試,等OK了再換成距離遠一點的無線模塊;最多8通道,PCB還在打樣中。部分原理圖和PCB如下圖所示:




        手頭上隨便找了一個單片機板子,是STC12C5410AD的,編寫了一個航模遙控器AD采集和PPM發射的最簡單程序,具體程序如下:
        /************ STC12C5410AD學習板 ******************/
        /*功能描述:STC12C5410AD內部AD使用 */
        /*作者: ClimberWin */
        /*外部晶振22.1184 MHZ */
        /*L7805穩壓在4.88-4.98V之間,根據實際測量確定電壓 */
        /**************************************************/
        /*修改時間: */
        /*修改內容: */
        //2011.7.28
        //AD采集產生PPM波形
        //實際調試OK
        #include
        #include
        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int
        #define ulong unsigned long
        sbit PPM_OUT = P2^5; //溫度測量,測量熱敏電阻的參數?
        uint ad_temp; //AD數據保存的地址
        uint ad0_data; //AD數據保存的地址
        uint ad1_data; //AD數據保存的地址
        uint ad2_data; //AD數據保存的地址
        uint ad3_data; //AD數據保存的地址
        uint ad4_data; //AD數據保存的地址
        uint ad5_data; //AD數據保存的地址
        void Delay1ms(unsigned int count);
        void STC12C5410AD_int(void); //AD初始化
        void Delay1ms(unsigned int count);
        void Delay1ms(unsigned int count)
        {
        unsigned int i,j;
        for(i=0;i
        for(j=0;j<120;j++);
        }
        void delay(unsigned int count)
        {
        unsigned int i;
        for(i=0;i
        }
        /*STC12C5410AD的AD初始化程序*/
        // ADC_CONTR=[ADC_POWER] [SPEED1] [SPEED0] [ADC_FLAG] [ADC_START] [CHS2] [CHS1] [CHS0]
        // ADC_DATA 高8位 ADC_LOW2 //低2位
        void STC12C5410AD_int(void)
        {
        ADC_CONTR=0x80 ; //開轉換電源 設置轉換速度為1080個時鐘周期轉換一次,選擇AD0通道
        Delay1ms(20); //稍做延時,大于1ms就可以
        /*I/O口作為AD使用,設置漏極開路模式*/
        P1M0=1;
        P1M1=1;
        }
        /*******************************************/
        //一個波形20ms,6個PPM波形,高電平每個波形最大1.4ms,最小0.6ms,低電平固定0.4ms
        /*
        */
        void PPW_Sent(uchar Channel1,Channel2,Channel3,Channel4,Channel5,Channel6) // PPM波形產生
        {
        uint cc;
        cc=1000;
        PPM_OUT=1;
        //delay(5000); //20ms
        delay(cc-ad0_data);//
        delay(cc-ad1_data);//
        delay(cc-ad2_data);//
        delay(cc-ad3_data);//
        delay(cc-ad4_data);//
        delay(cc-ad5_data);//
        PPM_OUT=0;
        delay(220);//0.4ms
        //通道1
        PPM_OUT=1;
        delay(330);//0.6ms
        delay(ad0_data);//1ms
        PPM_OUT=0;
        delay(220);//0.4ms
        //通道2
        PPM_OUT=1;
        delay(330);//0.6ms
        delay(ad1_data);//1ms
        PPM_OUT=0;
        delay(220);//0.4ms
        //通道3
        PPM_OUT=1;
        delay(330);//0.6ms
        delay(ad2_data);//1ms
        // delay(770);//1.4ms
        PPM_OUT=0;
        delay(220);//0.4ms
        //通道4
        PPM_OUT=1;
        delay(330);//0.6ms
        delay(ad3_data);//1ms
        PPM_OUT=0;
        delay(220);//0.4ms
        //通道5
        PPM_OUT=1;
        delay(330);//0.6ms
        delay(ad4_data);//1ms
        PPM_OUT=0;
        delay(220);//0.4ms
        //通道6
        PPM_OUT=1;
        delay(330);//0.6ms
        delay(ad5_data);//1ms
        PPM_OUT=0;
        delay(220);//0.4ms
        PPM_OUT=1;
        }
        /*****************主程序************************/
        main()
        { //main start
        uint aa;
        ad0_data=220;
        ad1_data=220;
        ad2_data=220;
        ad3_data=220;
        ad4_data=220;
        ad5_data=220;
        aa=220;
        STC12C5410AD_int(); //AD初始化
        while(1)
        {
        ADC_CONTR=0xe0 ; //開轉換電源 設置轉換速度
        delay(aa);//
        ///////AD0轉換
        ADC_CONTR|=0x08; //開始AD轉換(ADC_START=1)
        ADC_CONTR|=0x00; //選擇AD0通道
        while(!(ADC_CONTR & 0x10)); //判斷AD是否轉換結束
        ADC_CONTR&=0xef;//轉換結束后標志位ADC_FLAG清零
        ad_temp=ADC_LOW2;
        ad_temp=(ad_temp+ ((uint)ADC_DATA)<<2); //最大0.8ms delay(440)
        ad0_data=ad_temp/2.3;
        ///////AD1轉換
        ADC_CONTR=0xe0 ; //開轉換電源 設置轉換速度
        delay(aa);//
        ADC_CONTR|=0x08; //開始AD轉換(ADC_START=1)
        ADC_CONTR|=0x01; //選擇AD1通道
        while(!(ADC_CONTR & 0x10)); //判斷AD是否轉換結束
        ADC_CONTR&=0xef;//轉換結束后標志位ADC_FLAG清零
        ad_temp=ADC_LOW2;
        ad_temp=(ad_temp+ ((uint)ADC_DATA)<<2); //最大0.8ms delay(440)
        ad1_data=ad_temp/2.3;
        ///////AD2轉換
        ADC_CONTR=0xe0 ; //開轉換電源 設置轉換速度
        delay(aa);//
        ADC_CONTR|=0x08; //開始AD轉換(ADC_START=1)
        ADC_CONTR|=0x02; //選擇AD2通道
        while(!(ADC_CONTR & 0x10)); //判斷AD是否轉換結束
        ADC_CONTR&=0xef;//轉換結束后標志位ADC_FLAG清零
        ad_temp=ADC_LOW2;
        ad_temp=(ad_temp+ ((uint)ADC_DATA)<<2); //最大0.8ms delay(440)
        ad2_data=ad_temp/2.3;
        ///////AD3轉換
        ADC_CONTR=0xe0 ; //開轉換電源 設置轉換速度
        delay(aa);//
        ADC_CONTR|=0x08; //開始AD轉換(ADC_START=1)
        ADC_CONTR|=0x03; //選擇AD3通道
        while(!(ADC_CONTR & 0x10)); //判斷AD是否轉換結束
        ADC_CONTR&=0xef;//轉換結束后標志位ADC_FLAG清零
        ad_temp=ADC_LOW2;
        ad_temp=(ad_temp+ ((uint)ADC_DATA)<<2); //最大0.8ms delay(440)
        ad3_data=ad_temp/2.3;
        /*
        ///////AD4轉換
        ADC_CONTR=0x83 ;
        delay(aa);//
        ADC_CONTR|=0x08; //開始AD轉換(ADC_START=1)
        ADC_CONTR|=0x04; //選擇AD4通道
        while(!(ADC_CONTR & 0x10)); //判斷AD是否轉換結束
        ADC_CONTR&=0xef;//轉換結束后標志位ADC_FLAG清零
        ad_temp=ADC_LOW2;
        ad_temp=(ad_temp+ ((uint)ADC_DATA)<<2); //最大0.8ms delay(440)
        ad4_data=ad_temp/2.3;
        ///////AD5轉換
        ADC_CONTR=0x83 ;
        delay(aa);//
        ADC_CONTR|=0x08; //開始AD轉換(ADC_START=1)
        ADC_CONTR|=0x05; //選擇AD5通道
        while(!(ADC_CONTR & 0x10)); //判斷AD是否轉換結束
        ADC_CONTR&=0xef;//轉換結束后標志位ADC_FLAG清零
        ad_temp=ADC_LOW2;
        ad_temp=(ad_temp+ ((uint)ADC_DATA)<<2); //最大0.8ms delay(440)
        ad5_data=ad_temp/2.3;
        */
        PPW_Sent();
        }
        }


        關鍵詞: 航模遙控器PPM波

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 沙坪坝区| 涟水县| 山阴县| 清水河县| 广德县| 庄浪县| 莱芜市| 贞丰县| 湟源县| 泾源县| 论坛| 耿马| 固安县| 长丰县| 临猗县| 七台河市| 文安县| 阿拉尔市| 黑河市| 铜川市| 凌云县| 南澳县| 林甸县| 乃东县| 海林市| 大方县| 凉城县| 安陆市| 德化县| 赤水市| 宽甸| 福安市| 时尚| 柘城县| 香港 | 乡宁县| 莲花县| 衡水市| 祁门县| 古丈县| 利川市|