FC2カウンター

現在の訪問者数

現在の閲覧者数:

カレンダー

05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

プロフィール

剣菱P

Author:剣菱P
剣菱Pと申します。
性別:男
年齢:27
二兎を追って一兎も得られないタイプ

マイコンやプログラミング、ニコニコ動画、雑記等
方向性は見えずとも、ちょっとずつ更新していく予定です!

リンクフリーです。
こんなブログでよかったらよろしくお願いしま~す。

公開メール kenbishiP@gmail.com

検索フォーム

最新記事

最新コメント

カテゴリ

メールフォーム

名前:
メール:
件名:
本文:

月別アーカイブ

最新トラックバック

リンク

ブロとも一覧

ブロとも申請フォーム

ランキング

ランキング参加中です。気が向いたらクリックしてあげてください。


にほんブログ村 その他趣味ブログへ
にほんブログ村 その他趣味ブログ 趣味の工作へ

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ソフトウェアで複数サーボ 複数サーボ駆動 テスト1»

コメント

コメントの投稿













管理者にだけ表示を許可する

PIC 複数サーボ駆動成功


LEDでサーボ信号が8分割出来たことを確認したので、

さっそくサーボモータをつないで見ました。

別に8個やら無くても確認できるので

とりあえず3つ

むしろ電源の都合で実験回路だと8個ドライブできなかったりするかも


LED回路をはずして
CPLDの論理反転を解除

さあ!動けサーボモーター達よ!


・・・

あれ、なんかロックがかかってる。

どうやら不正な信号を送信してるらしい・・・


いろいろ試したところ PICのプログラムに不備を発見

タイマー1割り込みが発生した時に サーボ信号を立ち上げて、

その後にセレクターを設定していましたが、

それだとセレクター再設定までのわずかな時間だけれど

前のセレクト状態でパルスを出力してしまう。

つまり隣の信号に今の信号が一瞬現れることに、

これだけでもサーボ君は動いてくれないんですねぇ

ってなわけで、修正して
セレクターを設定してから サーボ信号を立ち上げるようにしました。

ついでに、メインループで 3つのサーボを動かしてます。

プログラム



#include<16F877A.h>
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP
#use delay(CLOCK = 20000000)
#use rs232(BAUD = 9600,XMIT = PIN_C6, RCV = PIN_C7)
#define ZERO_P 53036
#define CENTER 60536
unsigned int select=0;
unsigned long data[8] = {CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER};

#int_timer1
void isr1(){
   
    set_timer1(0xCFC2);
    output_low(PIN_B0);
    CCP_1 = data[select];

    switch(select){
        case 0: output_b(0x00 | (input_b() & 0xE3));break;
        case 1: output_b(0x04 | (input_b() & 0xE3));break;
        case 2: output_b(0x08 | (input_b() & 0xE3));break;
        case 3: output_b(0x0C | (input_b() & 0xE3));break;
        case 4: output_b(0x10 | (input_b() & 0xE3));break;
        case 5: output_b(0x14 | (input_b() & 0xE3));break;
        case 6: output_b(0x18 | (input_b() & 0xE3));break;
        case 7: output_b(0x1c | (input_b() & 0xE3));break;
        default : output_b(0x00 | (input_b() & 0xE3));
    }
    output_high(PIN_B0);
    select++;
    if(select >=8) select = 0;
}

#int_ccp1
void ccp1_isr(){
    output_low(PIN_B0);
}


void main(){
    set_tris_b(0);

    setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
    set_timer1(0xCF2C);

    setup_ccp1(CCP_COMPARE_INT);
   
    enable_interrupts(INT_CCP1);
    enable_interrupts(INT_TIMER1);
    enable_interrupts(GLOBAL);
   
    output_b(0x00);
    while(1){
        data[0] = CENTER;
        data[1] = CENTER;
        data[2] = CENTER;
        delay_ms(1000);

        data[0] = CENTER + 4000;
        delay_ms(1000);
        data[1] = CENTER + 4000;
        delay_ms(1000);
        data[2] = CENTER + 4000;
        delay_ms(1000);

        data[0] = CENTER - 4000;
        delay_ms(1000);
        data[1] = CENTER - 4000;
        delay_ms(1000);
        data[2] = CENTER - 4000;
        delay_ms(1000);
       

    }
}


↑赤いところの位置が重要

セレクター信号を出す時に
output_b(0x00 | (input_b() & 0xE3));


なんてことをしてますが、
output_low(PIN_B2);output_low(PIN_B3);output_low(PIN_B4);
という風に別々にやった方が、トータルでの実行時間は短い気がする。

でも、出来るだけいっぺんにセレクター信号は変えたほうがいい気もする。


まぁ、とりあえずちゃんと動いたから いいかな 現状で

3つでもきちんと動いてくれるとかわいいなぁ
[高画質で再生]

PICで複数サーボ駆動

[広告] VPS

スポンサーサイト

ソフトウェアで複数サーボ 複数サーボ駆動 テスト1»

コメント

コメントの投稿













管理者にだけ表示を許可する


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。