中華STM32基板のBlackpillを味見しています.
今回はADCを動かします.
ADCを動かすと言ってもいろんな動かし方の作法があるわけでして、、、ここでやったのは次の仕組みです.
・サンプリング周波数は500Hz
・連続する500ptsをメモリにストア (1秒分)
・同500ptsをCDC(USB COM)でPCへ送信する
・サンプリング周期はTIM3の出力する2mSecで決める (つまりhardware自走)
・ADC入力はIN9の1本だけ (多入力scanも出来るが使わない)
・ADCは1トリガ1サンプル (自動16サンプルまで出来るが使わない)
・DMAは使わない
・ADC完了をIRQで知る
・同IRQで500pts分のbufferに積む
・同IRQでbuffer fullになったらUSB送信を起動 (USB送信はブロックモード)
・ADCは12bitなので、1サンプルあたりASCIIの3bytesをbufferに積む
・ゆえに1USB送信あたり1500bytes
・USB FULL SPEED(12Mbps)で1500bytes送信するのにover head込みで10mSecぐらいかかるのでその間はADC変換動作は滞るが気にしない
ADC dataをPCでグラフに描いたもの.もっとノイジーかと思ってたけれどそんなに悪くない.
ーーーー
ArduinoIDEと違ってSTM32CubeIDEのsourceは大量なので全部を網羅した説明はできません.かいつまんで説明します.
↓まずはclock設定から.STM32F401CCの最高clockにする.
IRQハンドラを生成させる.
設定は以上でだいたいおしまい.
以下はsource.
main()の追加点.
Init()の下に2行追加.TIM3を起動する.ADCを起動する.
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM2_Init();
MX_TIM11_Init();
MX_USB_DEVICE_Init();
MX_TIM3_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim3);
HAL_ADC_Start_IT(&hadc1);
/* USER CODE END 2 */
ADC割り込みハンドラにいろいろ追加.
やってることは、
①AD dataをもってくる
②ASCII変換する
③bufferに積む
④500 dataを積んだらUSB送信
void ADC_IRQHandler(void){
/* USER CODE BEGIN ADC_IRQn 0 */
uint32_t adc = HAL_ADC_GetValue(&hadc1); ①
static N = 0;
static uint8_t usbbuf[3*500+100]; // 3byte x 500pts
if(N==0) usbbuf[0]=0;
char c[15];
sprintf(c,"%03X",adc); ②
strcat(usbbuf,c); ③
if(N++>=499){
int l = strlen(usbbuf);
usbbuf[l] = '\n';
CDC_Transmit_FS(&usbbuf[0],l+1); ④
N=0;
}
/* USER CODE END ADC_IRQn 0 */
HAL_ADC_IRQHandler(&hadc1);
}
source変更は以上です.
ADC関係がやけに簡単に見えますが、ADC起動~ADCサンプル完了まではhardwareで自走してくれるのでprogramでやることはありません.
かしこ
「サンプル波形」って、まるっきり、
返信削除・E*G
の波形じゃないですか・・・
※やはり「ソレ系」の回路作ってんですね。納得しました。
ぎょぎょー
削除※まさか、「開発者自身」が、検体になってたりして。
削除ドキドキするー
削除これで工学院のれぽーとの締め切りはまにあいそうだっちゃ!
返信削除なぜかみんながみんなブラックピルのれぽーと
これじゃはんこ押せねーな 再提出!
がびーん
コピーレポートを提出して優をとる
削除PC側ではSTM32CubeIDEがあればいいんですか。それなら買ってみようかなと
返信削除Yes.
削除