sekirara-engineerのブログ

sekirara-engineerのブログ

ブログの説明を入力します。

Amebaでブログを始めよう!
RCサーボが何故か片方向にしか動かないバグがあったが、
単純にPWMのH/Lアクティブが間違っていただけだった。

まあ、自分の知ってる範囲のバグで、すぐ直せて良かった(・∀・)ノ


ここにソースを貼り付けていって良いものか悩むけど、
誰のソースも参考にしてないから問題ないかな…?

-----------------------------------------------------
#include"sfr_r8m12a.h"

#define    pwm_cycle    50000    // 20ms周期
#define    pwm_max        5000    // PWM最大値
#define    pwm_min        2500    // PWM最大値

void init(void);
void wait(unsigned int ms);
void main(void);

void init(void)
{
    /*************************************/
    /* 変数初期化                        */
    /*************************************/
    int j;
   
    /*************************************/
    /* システムクロック設定              */
    /*************************************/
    prc0 = 1;        // 書き込み許可
    hocoe = 1;        // HOCO有効化
   
    for(j = 0; j < 100; j++);
   
    hscksel = 1;    // HOCO選択
    scksel = 1;        // システムクロック:fHSCK
    prc0 = 0;        // 書き込み禁止
   
    /*************************************/
    // 動作確認用SW-LED                  */
    /*************************************/
    p1_0 = 1;        // 電源ON時のちらつき防止
    pu1_1 = 1;        // SW入力端子プルアップ
    pd1_0 = 1;        // LED接続ポート出力設定
   
    /*************************************/
    /* servo制御用設定                   */
    /*************************************/
    msttrc = 0;            // タイマRC有効化
   
    // 出力ポート設定
    p12sel0 = 1;
    p12sel1 = 0;
   
    // タイマRC設定(PWM)
    pwmb_trcmr = 1;        // PWMモード選択
    //pwmc_trcmr = 1;
    //pwmd_trcmr = 1;
    pwm2_trcmr = 1;
   
    polb_trccr2 = 0;    // 出力レベル:Lアクティブ
    //polc_trccr2 = 0;
    //pold_trccr2 = 0;
   
    tob_trccr1 = 0;        // 出力レベルH設定
    //toc_trccr1 = 0;
    //tod_trccr1 = 0;
   
    //cks2_trccr1 = 1;    // カウントソース:f32
    //cks1_trccr1 = 0;    // テスト用
    //cks0_trccr1 = 0;
    cks2_trccr1 = 0;    // カウントソース:f8
    cks1_trccr1 = 1;    // 本番用
    cks0_trccr1 = 1;
    cclr_trccr1 = 1;    // コンペア一致AでTRCCNTカウンタクリア
   
    eb_trcoer = 0;        // 出力許可
    //ec_trcoer = 0;
    //ed_trcoer = 0;
   
    trcgra = pwm_cycle;
    trcgrb = pwm_min;
    //trcgrc = 0xffff;
    //trcgrd = 0xffff;
   
    cts_trcmr = 1;    // タイマ動作開始
}

void wait(unsigned int ms)
{
    unsigned int j, k;
    for(j = 0; j < ms; j++)
    {
        for(k = 0; k < 1000; k++)
        {
            ;
        }
    }
}

void main(void)
{
    unsigned int pwm_b;
    pwm_b = pwm_min;
   
    // 初期化
    init();
   
    // 制御用ループ
    while(1)
    {
        p1_0 = p1_1;
        if(p1_1)
        {
            if(pwm_min < pwm_b)
            {
                pwm_b -= 10;
            }
        }
        else
        {
            if(pwm_max > pwm_b)
            {
                pwm_b += 10;
            }
        }
        trcgrb = pwm_b;
       
        wait(10);
    }
}
-----------------------------------------------------

これでも懸念点はまだまだあるけど、
とりあえず動いたことを喜びます(・∀・)ノ