ele-diary 趣味の電子工作ブログ

電子工作関係の記録です。

PIC32MX210xFの実験(PWM)

32bitタイマでPWMの実験をしてみました。

PWMの周期を変えていくサンプル。うねうね動きます。

回路図

f:id:pau2000:20170610161316j:plain

最低限でもこれくらいはいりそうです。電解コンデンサは内部のオシレータに必要です。VUSB3V3は、USBを使わないときに接続するようデータシートに指示があります。

コード

PIC32のTimer23(32ビットタイマ)の出力をOC1につないでPWMを実現しています。開発環境はMPLAB X IDE 3.50とXC32コンパイラPLIBはLecacyライブラリを使ってます。 harmonyという新しい開発環境があるんですが、あえて使っていません。ちょっと把握しづらいので。。

/*********************************************************************
 *
 *      PIC32MX210F016B test
 *
 *      Y.U 7/June/2017
 * 
 *  ********************************************************************/

#include <plib.h>
#include <stdlib.h>

// SYSCLK = 40 MHz (8MHz Crystal/ FPLLIDIV * FPLLMUL / FPLLODIV)
// PBCLK  = 40 MHz
#define SYSCLK  40000000L                      
#define SYSCLKdiv10MHz    (SYSCLK/10000000)    

// Configuration Bit
// DEVCFG3:
#pragma config IOL1WAY  = OFF           // Peripheral Pin Select Configuration
// DEVCFG2:
#pragma config FPLLODIV = DIV_2         // PLL Output Divider
#pragma config UPLLEN   = OFF           // USB PLL Enabled
#pragma config UPLLIDIV = DIV_2         // USB PLL Input Divider
#pragma config FPLLMUL  = MUL_20        // PLL Multiplier
#pragma config FPLLIDIV = DIV_2         // PLL Input Divider
// DEVCFG1:
#pragma config FWDTEN   = OFF           // Watchdog Timer
#pragma config WDTPS    = PS1           // Watchdog Timer Postscale
#pragma config FCKSM    = CSDCMD        // Clock Switching & Fail Safe Clock Monitor
#pragma config FPBDIV   = DIV_1         // Peripheral Clock divisor
#pragma config OSCIOFNC = OFF           // CLKO Enable
#pragma config POSCMOD  = OFF           // Primary Oscillator
#pragma config IESO     = OFF           // Internal/External Switch-over
#pragma config FSOSCEN  = OFF           // Secondary Oscillator Enable (KLO was off)
#pragma config FNOSC    = FRCPLL        // Oscillator Selection
// DEVCFG0:
#pragma config CP       = OFF           // Code Protect
#pragma config BWP      = ON            // Boot Flash Write Protect
#pragma config PWP      = OFF           // Program Flash Write Protect
#pragma config ICESEL   = ICS_PGx3      // ICE/ICD Comm Channel Select
#pragma config JTAGEN   = OFF           // JTAG Enable
#pragma config DEBUG    = OFF           // Background Debugger Enable

void delay_us(unsigned int usec);
void delay_ms(unsigned int msec);

#define _SUPPRESS_PLIB_WARNING

int main(void)
{

    //System Setting
    SYSTEMConfigPerformance(SYSCLK);    //????????
    mJTAGPortEnable(DEBUG_JTAGPORT_OFF); //PORTA is used I/O, JTAG port must be disabled.

    mPORTAClearBits( BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0 );
    mPORTASetPinsDigitalOut( BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0 );
    ConfigCNBPullups(CNB13_PULLUP_ENABLE);//RB13??????
    mPORTBClearBits( BIT_5 );           //RB5?Low?

    mPORTBSetPinsDigitalOut( BIT_5 );   //RB5???

    //delay_ms(2000);                     //2???
    mPORTBClearBits( BIT_5 );           //RB5?Low?

    
    OpenTimer23(T23_ON | T23_SOURCE_INT | T23_PS_1_1,256);
    
    OpenOC1(OC_ON | //PWM mode
      OC_TIMER_MODE32 | //32bit
      OC_TIMER2_SRC | //
      OC_PWM_FAULT_PIN_DISABLE, //
      128, //OCxRS
      128); //OCxR
    
    RPB4Rbits.RPB4R = 0b0101; //RB4->OC1
   

    int cnt1=0,cnt2=0;
    while(1)
    {
        mPORTBToggleBits( BIT_5 );     //RB5 toggle for test
        delay_us(50);
        cnt1++;
        
        if (cnt1==128){
            cnt1=0;
            cnt2++;
            SetDCOC1PWM(cnt2);             
            if (cnt2==255){
                cnt2=0;

            }
        }

    }
}


void delay_us(unsigned int usec){
    unsigned int i, delay;

    delay = usec * SYSCLKdiv10MHz;
    for(i=0; i<delay; i++){}
}

void delay_ms(unsigned int msec){
    unsigned int i;

    for(i=0; i<msec; i++)
        delay_us(1000);
}
'''[f:id:pau2000:20170610161316j:plain]

DC昇圧回路の実験

簡単なDC-DCで昇圧する回路を実験してみました。発信源はPICで、ほぼLチカと同じ感じのソフトを書きます。

f:id:pau2000:20170116233119j:plain f:id:pau2000:20170116233123j:plain f:id:pau2000:20170116233127j:plain

不思議な波形ですが、それなりに電圧がでているようです。本当はコイル側にダイオードを入れるべきですね。 出力の2次側に整流、平滑回路を入れて波形をみてみようと思います。

MPLAB X IDEでconfiguration bitの設定をする方法

PIC16F819で久々に開発してて、Configuration bitの設定を忘れてしまいがちなので備忘録。

Windowメニューから、PIC Memory Views → Configuration bitsと降りていくと、GUI設定画面が出てきます。 ここで、適宜設定すると、ソースコードに書き出すことができます。

f:id:pau2000:20161223165038j:plain

それにしても古いバージョンのIDEや、古いコンパイラではすべて流儀が違うようで、検索でヒットする情報がかなり使えないことが多いです。 勘弁してほしい。。

Onion Omega を、Ubuntu からアクセス

Onion Omegaは、超小型のCPUボードで、それなりに強力なCPUが乗っているのと、Wifiが標準ということで遊びがいがあります。 USB接続すると、USB serial に見えるようで、ログインしてターミナルに入れます。

ただ、デフォルト状態のUbuntu Linux(15.04)に直結してログインしようとすると。。/dev/ttyUSBのパーミッション問題があり、 onionのサイトの説明 How do I connect to the Omega via Serial? : Onion Corporation の通りにはいきません。。。

以下のような設定ファイルを/etc/udev/rules.d以下において、USBシリアルを差したときのパーミッションを指定してあげる必要がありました。

  $ cat /etc/udev/rules.d/71-usbserial.rules
  #
  # persistent names for USB-serial I/F devices

  KERNEL=="ttyUSB*",MODE="0666"

さてさて、やっと本格的にonionをいじれそうです。

Onion Omegaを入手

f:id:pau2000:20151027235924j:plain

kickstarterで申し込んでいた、Onion Omegaが届きました! Arudinoよりは賢くて、Raspberry piよりちょっとお手軽っていう感じの、CPUボードです。 小さくていい感じかも。

軽く動かしてみたんですが、RaspberrypiだとSDカードを作るとこから始めないといけないのが、 さっくりOSが起動して、無線LAN認識するとこまではいけたのでお手軽でよいかと思います。

Ubuntuで設定はちょっとはまりポイントありましたが(^^;また後で書きます。