今回からF4 discoveryではなくて、 自作F4基板でプログラムの評価をする。discoveryは周辺機能が盛りだくさんである一方で、使えるポートに制限があるので、ピッチ変換基板的な基板を作った。
詳しい話は、また別の機会に。
とりあえず、ポートの制限がなくなった。
さて本題。情報としては知っていたのだけれど、STM32のAD変換で、はまった。
STM32の12bitAD変換は変換結果を左詰にするか、右詰にするかを選べるのだけれど、右詰に設定しても、それが有効化されないのだ。
花岡ちゃんに花束を(STM32F4のAD変換トラブル(その2))
このページで、ADCの初期化でADC_DeInit();を実行すれば良いとされているが、それだけでは解決されなかった。
試行錯誤の結果、ADCの初期化処理の最後にウェイト処理を追加することで解決したので、ADCの初期化が完了する前に、ADCを使い始めてしまったのだろうか?
おそらく、データシートには書いてあるのだろうけれど、詳しく見てないので分からない。
ソースコードは以下。
2015年5月31日日曜日
2015年5月16日土曜日
STM32でモータ制御1
STM32F4でコアレスモータmk06を回してみた。
PB4、PB5にロータリーエンコーダを接続して、TIM3の位相計数でカウントしています。
モータはPE9、PE11に接続したモータドライバBD6211を介して行ないます。PE9、PE11はTIM1のPWM出力で動作します。
すんなりとはいかなかったところは以下。
1.符号なし変数から符号あり変数へのキャスト。
ロータリーエンコーダを使って、カウント動作させてみたのだけれど、STM32のレジスタは符号なしで定義されているので、負の値がそのまま使えない。
そこで、何も考えずにC言語の型のキャストを使ってみたのだけれど、うまくはいかなかった。
int16_t counter = (int16_t) TIM3->CNT;
これで、符号なし16bitデータを符号付16bitデータに出来たと思って、printfデバッグしてみた。
printf("counter : %d " , counter);
この値が、常に正の数で、デクリメントしても負の数にならない。0の下が65535になってしまう。
仕方ないので、最上位bitが1の時は、2の補数を取ることで、負の数にしている。
本当はもっときれいな方法があるのだろうけれど・・・。
2.TIM1(高機能タイマ)の動作
汎用タイマのTIM3などを使うときは必要ないのだけれど、高機能タイマのTIM1を出力で使用するときは、以下のコマンドが必要。
TIM_CtrlPWMOutputs(TIM1,ENABLE); // 高機能タイマ専用
詳しく追いかけていないけれど、必要だということで書いておく。
3.BD6211の制御論理
説明の前に、まずはモータドライバICのBD6211のデータシートを紹介(秋月リンク)。
このドライバを使ってPWM制御する際には、PWM制御モードAとPWM制御モードBというのがある。詳しいことはデータシートを見てほしいのだけれど、真理値表を見るとPWMで制御しないほうのピンをH固定するか、Lこてするかの違いに見えた。
その程度の違いなら、PWMモードAでいいかなと思い、ソフトのコーディングをした。
コンパイルエラーもなくしたところで、もう一度データシートを見ていたら、PWM制御モードAだと、PWM周期が20kHz以下だと途中でスタンバイモードになるため、理想どおりの制御にならないことがあると書かれている。
今回は、84kHz周期で使う予定なので、問題ないのだけれど、やはり気になるので、PWM制御モードBに変更した。
といっても、この段階では使っていないほうのピンをH固定からL固定にしただけ。
そして通電。
リセット直後は、信号を出していないのでモータは空転状態。そして、ロータリーエンコーダを一回まわすと、勢いよく回り始めた。なんだか全力で。これがコアレスモータの性能なのかと思いながらもロータリーエンコーダをまわし続けたら、次第にモータの元気がなくなってきた。
・・・あれ?
熱か電流でモータにダメージでも与えてしまったのかと思い、リセット。
気を取り直してエンコーダを回すと勢いよく回る。
ここで一呼吸おいて、よく考えてみたら当然のことだった。PWM制御モードをAからBに変更したときに、PWM制御してないほうの端子の論理を反転したのに、PWM信号自体はそのままだったので、最小幅のPWMで制御しているつもりが、最大幅になっていたのだ。すぐにTIM1のPWM出力の論理も反転することで、思ったとおりにゆっくりスタートのモータ制御が出来た。
ソースコードの表示は、以下をクリック。(書きなぐりでまとめてないので、汚いです。)
PB4、PB5にロータリーエンコーダを接続して、TIM3の位相計数でカウントしています。
モータはPE9、PE11に接続したモータドライバBD6211を介して行ないます。PE9、PE11はTIM1のPWM出力で動作します。
すんなりとはいかなかったところは以下。
1.符号なし変数から符号あり変数へのキャスト。
ロータリーエンコーダを使って、カウント動作させてみたのだけれど、STM32のレジスタは符号なしで定義されているので、負の値がそのまま使えない。
そこで、何も考えずにC言語の型のキャストを使ってみたのだけれど、うまくはいかなかった。
int16_t counter = (int16_t) TIM3->CNT;
これで、符号なし16bitデータを符号付16bitデータに出来たと思って、printfデバッグしてみた。
printf("counter : %d " , counter);
この値が、常に正の数で、デクリメントしても負の数にならない。0の下が65535になってしまう。
仕方ないので、最上位bitが1の時は、2の補数を取ることで、負の数にしている。
本当はもっときれいな方法があるのだろうけれど・・・。
2.TIM1(高機能タイマ)の動作
汎用タイマのTIM3などを使うときは必要ないのだけれど、高機能タイマのTIM1を出力で使用するときは、以下のコマンドが必要。
TIM_CtrlPWMOutputs(TIM1,ENABLE); // 高機能タイマ専用
詳しく追いかけていないけれど、必要だということで書いておく。
3.BD6211の制御論理
説明の前に、まずはモータドライバICのBD6211のデータシートを紹介(秋月リンク)。
このドライバを使ってPWM制御する際には、PWM制御モードAとPWM制御モードBというのがある。詳しいことはデータシートを見てほしいのだけれど、真理値表を見るとPWMで制御しないほうのピンをH固定するか、Lこてするかの違いに見えた。
その程度の違いなら、PWMモードAでいいかなと思い、ソフトのコーディングをした。
コンパイルエラーもなくしたところで、もう一度データシートを見ていたら、PWM制御モードAだと、PWM周期が20kHz以下だと途中でスタンバイモードになるため、理想どおりの制御にならないことがあると書かれている。
今回は、84kHz周期で使う予定なので、問題ないのだけれど、やはり気になるので、PWM制御モードBに変更した。
といっても、この段階では使っていないほうのピンをH固定からL固定にしただけ。
そして通電。
リセット直後は、信号を出していないのでモータは空転状態。そして、ロータリーエンコーダを一回まわすと、勢いよく回り始めた。なんだか全力で。これがコアレスモータの性能なのかと思いながらもロータリーエンコーダをまわし続けたら、次第にモータの元気がなくなってきた。
・・・あれ?
熱か電流でモータにダメージでも与えてしまったのかと思い、リセット。
気を取り直してエンコーダを回すと勢いよく回る。
ここで一呼吸おいて、よく考えてみたら当然のことだった。PWM制御モードをAからBに変更したときに、PWM制御してないほうの端子の論理を反転したのに、PWM信号自体はそのままだったので、最小幅のPWMで制御しているつもりが、最大幅になっていたのだ。すぐにTIM1のPWM出力の論理も反転することで、思ったとおりにゆっくりスタートのモータ制御が出来た。
ソースコードの表示は、以下をクリック。(書きなぐりでまとめてないので、汚いです。)
STM32F4 エンコーダ入力
秋月で売っている、このロータリーエンコーダーを使って、STM32のエンコーダー入力を試してみる。
参考にしたのは、以下のサイト。
・ロータリエンコーダによる角度検出
・Encoder Interfaceについて(ちょろまつ製作記)
以下は、STM32F4 discoveryで試したソース。
エンコーダの1クリックで、カウントが2つ変化するのは、B相の立上がりと立下りの両方でカウントしているのだろうか?ちょっとよく分からない。
ソースコードは以下。
STM32のSPI通信のエッジの設定
2月8日の記事にて、STM32のSPI通信のデータ取り込みエッジの設定を、
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
としていたが、これだと、送信データの8bit目が1のときに、タイムアウトみたいな変な動きをする。
そこで、以下のように変更したところ、まともに動くようになった。
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
時間を見つけて、きちんと波形で確認しないといけないと思った。
2015年2月8日日曜日
ubuntu 14.04にアップグレード
自宅サーバに使っているubuntuを14.04にアップグレードした。(いまさら・・・)
途中、各種の設定ファイルを新しいバージョンにするか、現在有効なのを使うかの選択を何回か聞かれた。
全部の設定をやり直すの面倒だったので、すべての質問で、現状維持と答えた。
それでアップグレードが終わって再起動したので、動作確認をした。
といっても、ファイルサーバとwwwサーバとしてしか使っていないので、やることは多くない。
まずは、Windowsからネットワークコンピュータ経由でサーバにアクセスして、ファイルが実行できることを確認。OK。
続いて、ブラウザ経由でwwwサーバの確認。NG。・・・あれ?
linuxは詳しくないので、なにをどうしていいのか分からないけれど、まずはエラーの確認をした。
sudo tail -F /var/log/apache2/error.log
すると、以下のようなエラーが発生している。
script '/var/www/html/index.html' not found or unable to stat
これまで、データは
/var/www
に置いていたのに、アクセスは
/var/www/html/
になってる。これはDocumentRootが書き換わっているに違いない。
それで、グーグル先生に聞いたところ、以下のサイトを紹介してくれた。
ITシロウトの備忘録(http://ubunturailsaaa.blogspot.jp/2014/01/apache2.html)
このサイトにある方法を参考に、DocumentRootを編集して、apache2を再起動して、wwwサーバへのアクセス成功を確認した。
途中、各種の設定ファイルを新しいバージョンにするか、現在有効なのを使うかの選択を何回か聞かれた。
全部の設定をやり直すの面倒だったので、すべての質問で、現状維持と答えた。
それでアップグレードが終わって再起動したので、動作確認をした。
といっても、ファイルサーバとwwwサーバとしてしか使っていないので、やることは多くない。
まずは、Windowsからネットワークコンピュータ経由でサーバにアクセスして、ファイルが実行できることを確認。OK。
続いて、ブラウザ経由でwwwサーバの確認。NG。・・・あれ?
linuxは詳しくないので、なにをどうしていいのか分からないけれど、まずはエラーの確認をした。
sudo tail -F /var/log/apache2/error.log
すると、以下のようなエラーが発生している。
script '/var/www/html/index.html' not found or unable to stat
これまで、データは
/var/www
に置いていたのに、アクセスは
/var/www/html/
になってる。これはDocumentRootが書き換わっているに違いない。
それで、グーグル先生に聞いたところ、以下のサイトを紹介してくれた。
ITシロウトの備忘録(http://ubunturailsaaa.blogspot.jp/2014/01/apache2.html)
このサイトにある方法を参考に、DocumentRootを編集して、apache2を再起動して、wwwサーバへのアクセス成功を確認した。
STM32F4 discoveryでSPI2通信
STM32F4 discoveryでSPI通信を試してみた。使ったのはSPI2。
通信相手は、microchip社のMCP23S17(IOエクスパンダ)。試したのはマイコンからの送信のみ。受信は後日。
SPI2を使うための手順は、以下。
main.cのほかに、mcp23s17.cとmcp23s17.hを作ってリンクする。
ソースコードは以下。
通信相手は、microchip社のMCP23S17(IOエクスパンダ)。試したのはマイコンからの送信のみ。受信は後日。
SPI2を使うための手順は、以下。
- GPIOのクロックを有効化
- GPIOの初期化
- SPI2のクロックを有効化
- SPI2の初期化
- SPI2が割当てられている端子をGPIO→AF使用に設定
- SPI2を有効化
main.cのほかに、mcp23s17.cとmcp23s17.hを作ってリンクする。
ソースコードは以下。
2015年2月7日土曜日
fritzingでブレッドボードイメージ
昔はユニバーサル基板に部品を半田付けをして、回路を作成していましたが、最近はブレッドボードを使うことが多い。
私の場合、ブレッドボードで回路を組むと、接続のイメージは頭の中で行うので紙とかで記録に残らないので後日もう一度同じ回路を組み直すのが難しい。
それに、ブログで公開するときに写真だと、見てくれる人も配線のイメージがしにくいと思うので、なにかいい方法がないかと思っていた。
それで、ネットで調べているとfritzingというソフトがオススメらしいので試してみた(latest version 0.9.1b)。
http://fritzing.org/home/
使い方は直感的に分かるので省略。
作った図面を画像データで保存するときに、ちょっと気になったのでメモ。
ファイル-> エクスポート->as Image->PNG
で、PNGファイルを生成できるが、以下のようにワイヤーの周りに不必要な点線が出来てしまう。
これを回避するために、ちょっと遠回りだけれど、以下のようにすると上手くいく。
まず、
ファイル-> エクスポート->as Image->SVG
で、SVGファイルを生成できる。SVGファイルがどういうものか、知らないけれど、取り合えずブラウザで開けるので、ブラウザ上で画像を名前をつけて保存すればPNG形式のファイルを取得できる。
このやり方を使えば、画像右下のfritzingというロゴも消えますね(残っていてもいいのだけれど)。
簡単ですが、今回はここまで。
私の場合、ブレッドボードで回路を組むと、接続のイメージは頭の中で行うので紙とかで記録に残らないので後日もう一度同じ回路を組み直すのが難しい。
それに、ブログで公開するときに写真だと、見てくれる人も配線のイメージがしにくいと思うので、なにかいい方法がないかと思っていた。
それで、ネットで調べているとfritzingというソフトがオススメらしいので試してみた(latest version 0.9.1b)。
http://fritzing.org/home/
使い方は直感的に分かるので省略。
作った図面を画像データで保存するときに、ちょっと気になったのでメモ。
ファイル-> エクスポート->as Image->PNG
で、PNGファイルを生成できるが、以下のようにワイヤーの周りに不必要な点線が出来てしまう。
これを回避するために、ちょっと遠回りだけれど、以下のようにすると上手くいく。
まず、
ファイル-> エクスポート->as Image->SVG
で、SVGファイルを生成できる。SVGファイルがどういうものか、知らないけれど、取り合えずブラウザで開けるので、ブラウザ上で画像を名前をつけて保存すればPNG形式のファイルを取得できる。
このやり方を使えば、画像右下のfritzingというロゴも消えますね(残っていてもいいのだけれど)。
簡単ですが、今回はここまで。
登録:
投稿 (Atom)

