dsPIC33CKでFreeRTOSを実装

カテゴリー: PIC

以前PSoC5LPとPSoC Creater4.2にFreeRTOSを実装した記事「FreeRTOSをPSoC5LPで使う」と同様に、MPLAB XでdsPIC33CK256MP503にFreeRTOSを実装した覚書です。

使用アイテムは現時点で最新版、FreeRTOSV202012.00(カーネルはV10.4.3)、MPLAB X5.45です。 続きを読む…

板金用ハンダごてはビッグサイズだった!

カテゴリー: 電子回路全般

熱伝導の良い材料をはんだ付けする機会があったので、手持ちの100Wで実験すると、できるにはできたが時間がかかるし、時間をかけると全体が加熱され保持が難しい。20か所以上はんだ付けするのでちょっと大変です。

そこで、「板金用」の300Wはんだゴテを購入しました。 続きを読む…

Salome-Meca起動しないトラブル・・・Agent.exeが原因

カテゴリー: ソフトウェア

数週間前からFEMソフト「Salome-Meca Windows2018」が起動しなくなった。やっと原因究明にこぎつけた。

Salome-Meca起動直後で内部空きポートが探索出来ない

Salome-Mecaは複数のアプリを内部サーバで連携している(内部プロキシというのか?私はそこまで詳しくない(:_;))。そのための空きポートが探索できないらしい。ネットで調べたhostsファイルの書き換えでは効果なし。Windowsセーフモードでは起動できたので、スタートアップを一つずつ無効にしては再起動しながら調査した。時間と手間かかる~! 続きを読む…

FreeRTOSをPSoC5LPで使う。既存のプロジェクトに適用する

カテゴリー: PSoC,ソフトウェア

HOS V4以来のRTOSです。RTOSといっても、キャラクタLCDにリアルタイム表示させる、バックグラウンドで何かやらせる、程度で使うのみでした。

今回はメモリに多少余裕のあるPSoC5LP(CY8C5868LTI-038)で、アクチュエータ動作中にもUP/DOWNキーによるスピード設定をしたいので、既存のベアメタルファームに後からFreeRTOSを導入し、メインと設定タスクを分けてみました。FreeRTOSはPSoC5LP用のデモを公開しているので、OSのコンフィギュレーションはそれをコピーするだけでも導入はできます。

続きを読む…

Cortex-M4F(Nucleo-F446REボード)で、三相相補PWMを二系統使う

カテゴリー: mbed

目新しいことではないですが、ボード「Nucleo-F446RE」をmbed環境で手軽に使う、です。久しぶりにこのボードを使う機会がありまして、覚書きとして、過去のコードを引っ張り出してみました。1からコードを書くよりmbedの初期化を利用して楽にコーディングできます。

STM32ーM4なら、ほぼ共通でつかえます。

STM32で相補PWMをつかうには、タイムベースをTIM1とTIM8を選択。まずmbedでPWM出力を定義しておく。

相補PWMが使用できるタイマーモジュールはTIM1とTIM8です。数あるPWM出力からTIM1/8に関連するポートを抽出します。mbedで使うには、Nucleo-F446REのボードページから「PeripheralPins.c」を参照し、TIM1とTIM8が関わるポートをPwmOutで設定します。ボードのピンは固定されているので、下記の設定とともにピンレイアウトも決まります(これは仕方ないです)。


 

// *** Complemantry 3Phase PWM output *** 
PwmOut PWMU2L(PA_8); // PWM2_1 1L
PwmOut PWMU2H(PA_7); // PWM2_1N 1H
PwmOut PWMV2L(PA_9); // PWM2_2 2L
PwmOut PWMV2H(PB_0); // PWM2_2N 2H
PwmOut PWMW2L(PA_10); // PWM2_3 3L
PwmOut PWMW2H(PB_1); // PWM2_3N 3H
PwmOut PWMU1L(PC_6); // PWM1_1 1L
PwmOut PWMU1H(PA_5); // PWM1_1N 1H
PwmOut PWMV1L(PC_7); // PWM1_2 2L
PwmOut PWMV1H(PB_14); // PWM1_2N 2H
PwmOut PWMW1L(PC_8); // PWM1_3 3L
PwmOut PWMW1H(PB_15); // PWM1_3N 3H


mbed初期化を利用して、レジスタ操作を追加。

標準でTIM1はmbedOSでイニシャライズしてあるのでパラメータを上書きします。TIM8は個別にレジスタをセットします。PwmOut宣言で定義してあるので、該当ポートは「PWM出力」と定義されています。これに肉付けしていくのです。

まあ、TIM8は1から設定しているのでTIM1もわざわざmbed関数をつかうこともないですが・・

というわけで、初期化ルーチン(自分の装置に合わせてあります)。

void init_PWM(void) {
    PWMU1L.period_us(100);      // TIM1の仮の初期periodをAPIで設定しておく
    PWMV1L.period_us(100);      // TIM1の仮の初期periodをAPIで設定しておく
    PWMW1L.period_us(100);      // TIM1の仮の初期periodをAPIで設定しておく
    TIM1->CCR1 = TIM1->CCR2 = TIM1->CCR3 = 0;   // 初期デューティ0
    TIM8->CCR1 = TIM8->CCR2 = TIM8->CCR3 = 0;   // 初期デューティ0
    TIM1->CR1 &= 0xfffe;
    TIM8->CR1 &= 0xfffe;

    TIM1->ARR = PWMDIV;         // PWM division(period us)=PWMDIV(1000)
    TIM1->CCER = 0x0555;        // 相補PWM enable
    TIM1->BDTR = 0x805a;        // DeadTime:5.5556ns*5ah(90)=500ns(b7-5:0xx)
    TIM1->PSC = 8;              // Prescale=(PSC+1)*5.55556nS 20KHz
    // 使用する各ポートはAF3を使う
    GPIOA->AFR[0] |= 0x00300000;    // PA5
    GPIOA->AFR[1] |= 0x00000000;
    GPIOB->AFR[0] |= 0x00000000;
    GPIOB->AFR[1] |= 0x33000000;    // PB14,15
    GPIOC->AFR[0] |= 0x33000000;    // PC6,7
    GPIOC->AFR[1] |= 0x00000003;    // PC8
    // 使用する各ポートはAFRにセット
    GPIOA->MODER |=  0x00000800;    // PA5
    GPIOB->MODER |=  0xA0000000;    // PB14,15
    GPIOC->MODER |=  0x0002A000;    // PC6,7,8

    RCC->APB2ENR |= 0x2;       // TIM8 clock enable
    TIM8->CR1 = 0x1;           // TIM8 counter enable
    TIM8->CR2 = 0;
    TIM8->ARR = 1000;          // PWM division(period us)=PWMDIV(1000)
    TIM8->CCMR1 = 0x6868;      // OC1,OC2:PWM mode
    TIM8->CCMR2 = 0x0068;      // OC3:PWM mode

    TIM8->CCER = 0x0555;       // 相補PWM enable
    TIM8->BDTR = 0x805a;       // DeadTime:5.5556ns*5ah(90)=500ns(b7-5:0xx)
    TIM8->DIER = 0;
    TIM8->EGR = 3;
    TIM8->PSC = 8;             // Prescale=(PSC+1)*5.55556nS 20KHz

//    TIM1->CNT = 0;
//    TIM8->CNT = 0;
    TIM1->CR1 |= 0x1;
    TIM8->CR1 |= 0x1;
}

 

自分のシステムに合わせて設定してあります。20KHz、分解能は1000、デッドタイムは500nsです。用途に応じて設定してください。バッファ書込みが有効なので値更新でPWMが乱れることはありません。

コメントしていないレジスタについてはリファレンスマニュアルをご参照ください。AFRについては、TIM1を使うポートは”3″ではなく”1″かもしれませんが、確認しておりません。二つとも同じ周期なので、今回の用途は良しとします。

 

以上

久々のAKIーPICプログラマーとOTPーPIC

カテゴリー: PIC

もう20年以上続いている基板にPIC12C509A-04/Pを使っています。久しぶりに50ヶ書き込み作業です。 続きを読む…

ベンチュリ型風量計の製作 2013年の記事より

カテゴリー: CNC,治具

旧ホームページの製作記事の移植です。他の記事も順次移植中です。

立型風洞装置に装着している様子(写真は回転させています)

風量計がほしい

風量を扱う機器の委託業務があり、出荷検査のため基準計が必要でした。それまで大エンド様の試験場で校正した「神様」との比較で何とか切りぬけてきましたが、製作・検査はユーザーからは丸投げで特に指示もなく、酷使した老齢「神様」も心配です。それでは、と自分用の基準器を作ることにしました。 続きを読む…

φ4mmの小径パイプをφ80mmの円筒に密着するように曲げてみた

カテゴリー: 業務関連

一品物の製作は工夫のしどころです。今回はφ80mmの円筒にφ4mmの銅パイプを2.5ターン密着して巻き付けたい、というものです。

φ75mmの塗料缶で実験。巻き戻ってぶかぶかなコイルになった。

実験によると、直径で一割ぐらい巻き戻ることが分かりました。同じ径の円筒に巻き付けると仕上がり径は一割太いコイルになるということです。板金用語でよく言う「スプリングバック」です。そこで軟膏のビンや100均のボトルなど70mm前後の丁度良いものを探しましたが、なかなかみつかりませんので、製作することにしました。

1×4材を自在錐でカットし旋盤で整形、ボンドで貼りつける

というわけで、1×4材の端材で製作。この自在錐というもの、結構ワイルドで、材料をしっかり固定しないと食い込んだ時怖い目を見る。多少金属加工に慣れた私でも結構怖い。

円盤状にカットしたもの2枚張り付けて、あとは旋盤で円形を整え、更に1×4端材にビス止めして完成

いざ、製作!

パイプが細いので特に難しいことはありませんが、コツといえば「巻いている途中で緩めない事」です。パイプはあてがうものがないと急激につぶれるので、あとあとの追加工で品質と落とすことがないように、治具に密接して巻き付けるのが良いです。

治具の役目はこれでおしまい

乾燥剤の再生

カテゴリー: 業務関連

ストックしているチップ部品の保存密閉容器に入れている「シリカゲル」を定期交換しました。保存容器はPEのペール缶。PEはわずかですが吸湿性があるため定期的に除湿剤を交換しなければいけません。もっとも、本日みたいな湿っぽい日(湿度計でRH65%)にフタを開ける事自体がまずいかもしれません(^^;)。

いつも時差で十袋程度入れ換えていますが、交換した古いものは湿度指示粒がピンク色になりかけていました。たいていは廃棄してますが、再生にチャレンジです。 続きを読む…

dsPIC30F3012 DIPタイプの書き込み

カテゴリー: PIC

知人から、dsPIC30F3012の書き込みを頼まれました。普段はSOPかQFPを基板に設けたICSPコネクタで書き込んでいますが、dsPICのDIPタイプは久しぶりです。

dsPIC30F 18pinは、PIC16F/18Fの 18pinとピン配列が異なる

しばらくぶりだと、そんなことも忘れていました。そこで、手作りPIC書込みアダプタを急遽改良!