記事一覧

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

STM32F103C8T6を使った遅延器

今超安価な中華MCU基板のSTM32F103C8T6の載った、STM32DuinoではBluePillと呼ばれている基板を使い遅延器を作ってみました。

仕様としては8bit分の信号を1ms遅らせる、とゆうのが目的です。


使用した開発環境はEm::Blocks。

ソースコードは

#include "stm32f10x_conf.h"

#define SIZE 1026

void gpio_config(void);

static uint8_t Pdata[SIZE+2] = {};

uint16_t data_Pos=0;

int main(void)
{
gpio_config();

while(1)
{
Pdata[data_Pos] = (uint16_t)GPIOA->IDR;
data_Pos = data_Pos + 1;
data_Pos = data_Pos & 1023 ;
GPIOB->ODR = Pdata[data_Pos];
// GPIOB->BSRR=GPIO_Pin_8;

}
}

void gpio_config(void)
{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);

}
これだけです。

これでA0からA7の信号がB0からB7へ約1ms(正確には0.95mS)、MCUが72Mhz作動時のサンプリングレートは1.1MHz程度。
メイン関数のwhileのコメントアウトを外すとB8から1周期に1回のパルスを出力します、が、この命令のMCUへの命令が増えるので、実作動よりも少々遅くなります。

一応目標は1msピッタリだったのですが、サンプリングレートを上げるために、メモリを循環バッファとして使用する際の余剰計算にANDを使った結果、2のべき乗の数値になってしまい、、。

上記で&を使用してる部分で%を使い整数で割った場合の最大サンプリングレートは877KHz程度、、だったと思います。

マイコンの類、作動速度は非常に高速なのですが、実際の所、足し算をするだけでも、目盛りを読んで、計算して、計算結果をメモリに書く、といった、処理によっては数分の一、数十分の1、数百分の一の速度での作動となってしまいます。
単純に72MHz作動のマイコンの処理ループが1MHzだった場合、処理に72クロック、72CPUループが必要になります。

今回このプログラムでマイコンがしてるのはGPIOを初期化して、Aポートを読んでメモリに書き、メモリアドレスを一つインクリメントし、メモリを確保した範囲から飛び出させないように計算をし、メモリ内のデータをBポートに書き込んでいます。

このようなカツカツ動く、処理速度が欲しい(高いサンプリングレート)場合には、本来アセンブリ言語で書いた方が処理速度が稼げると思いますが、そんなスキルは私には無し。。

MCU自体が安価なので、このように使っても惜しくはない時代となりました。

プログラマブルロジックデバイスで同じことをした場合、高速で読み書きできるメモリが必要なので必然的にFPGAを使用することとなりますが、使用するロジックエレメンツもごく少量なので、、、コスト的に勿体無い気がしてしまいます。

サンプリングレートを上げようとすると、もっと作動速度の速いMCUを使用するのも手、だとも思いますが、勿体無いけれどもFPGAのメモリとロジックを使った場合の方が、大幅にサンプリングレートを上げることが出来ます。

ちなみにサンプリングレートと遅延量の関係はありません。単純に遅延量が増えれば、使用するメモリの量が増減するだけ。
とゆうことは、1MHzのサンプリングレートの最小遅延は1μS。

サンプリングレートが高いと、小さい幅の信号の読みこぼしがなくなるの、、で。。

スポンサーサイト

コメント

コメントの投稿

非公開コメント

プロフィール

akirahitosi

Author:akirahitosi
タイトルの通り個人的な備忘帳です。
使用しているMCUはSTM32F4とPSoC5LPなどなど。
自分が使う機能で、Web上の記事で参考にさせて頂いたページ等々を残しておこうとしてるので、このブログの記事のみでは、「できる」ようにはならないのでは?と思います。

最新コメント

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。