VS2019 C#でWindowsフォームアプリ作成で、数値専用TextBoxの覚書です。Webでは皆さんいろいろ試されているようです。それらのツマミ喰いで自分なりに実装してみました。 続きを読む…
dsPIC33CK256MP505では、2個のDedicated(専用)ADCと1個のShared(共用)ADCがあり、どちらもオーバーサンプリングフィルタを設定できます。今回初めて使ってみました。
いつもDedicatedADCは主にPWMトリガで電流検出に使うため、サンプルタイミングがクリティカルなのでオーバーサンプリングをしたことがありません。今回はADC1を1ms周期の普通のアナログ入力にしたので、適用してみました。
応用に使ったボードは20KHzPWMで強烈なスイッチングをしているのでセンサ入力など中・低速サンプリングには結構なノイズが乗ってきます。
dsPIC33CKでFreeRTOSを使うの続編です。RTOSでsprintfを使いたいですが、標準入出力のprintf/scanfは共通ヒープメモリを使うのでRTOSではうまくない、とのことです。実際sprintfではうまくなかったです。そこでCHaN氏作「xprintf」の登場です。
「xprintf」はすでにPSoC5LPでFreeRTOSでも使っています。使いたい関数は、文字列に対する「xsprintf」で、今回はfloatを扱ってみます。
なお、試していませんが、一文字出力ルーチンに出力のポインタを指定すれば、LCDやUARTに直接出力することもできるらしいです。う~ん、これは凄い!
環境はMPLAB Xv5.45 XC16 v1.6です

「RFILE_f(Read from input file)」は、XCOSで任意波形を出力するために必須のブロックですが今一つ使い方が不明確で、毎回適当にやってなんとか動いたところでおしまいにしていたので情報の蓄積がゼロでした。
今回掘り下げてみたので、覚書として書き留めておきます。
VC#2010で作成したアプリをベースにVisual Studio community 2019(以降VS2019)で開発しようとしたところ、読込んだプロジェクトが(非互換)と表示され、中身が開けない現象で作業が止まっていました。VS2017では開けるので何とかなるのですが、新機能の多いVS2019で一本化したいので試行していました。

以前PSoC5LPとPSoC Creater4.2にFreeRTOSを実装した記事「FreeRTOSをPSoC5LPで使う」と同様に、MPLAB XでdsPIC33CK256MP503にFreeRTOSを実装した覚書です。
使用アイテムは現時点で最新版、FreeRTOSV202012.00(カーネルはV10.4.3)、MPLAB X5.45です。 続きを読む…
熱伝導の良い材料をはんだ付けする機会があったので、手持ちの100Wで実験すると、できるにはできたが時間がかかるし、時間をかけると全体が加熱され保持が難しい。20か所以上はんだ付けするのでちょっと大変です。
そこで、「板金用」の300Wはんだゴテを購入しました。 続きを読む…
数週間前からFEMソフト「Salome-Meca Windows2018」が起動しなくなった。やっと原因究明にこぎつけた。
Salome-Meca起動直後で内部空きポートが探索出来ない
Salome-Mecaは複数のアプリを内部サーバで連携している(内部プロキシというのか?私はそこまで詳しくない(:_;))。そのための空きポートが探索できないらしい。ネットで調べたhostsファイルの書き換えでは効果なし。Windowsセーフモードでは起動できたので、スタートアップを一つずつ無効にしては再起動しながら調査した。時間と手間かかる~! 続きを読む…
HOS V4以来のRTOSです。RTOSといっても、キャラクタLCDにリアルタイム表示させる、バックグラウンドで何かやらせる、程度で使うのみでした。
今回はメモリに多少余裕のあるPSoC5LP(CY8C5868LTI-038)で、アクチュエータ動作中にもUP/DOWNキーによるスピード設定をしたいので、既存のベアメタルファームに後からFreeRTOSを導入し、メインと設定タスクを分けてみました。FreeRTOSはPSoC5LP用のデモを公開しているので、OSのコンフィギュレーションはそれをコピーするだけでも導入はできます。
目新しいことではないですが、ボード「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″かもしれませんが、確認しておりません。二つとも同じ周期なので、今回の用途は良しとします。
以上