STM32 F401RE チャタリング2
開発環境
・評価ボード NUCLEO-F401RE
・IDE MDK-ARM V5 and STM32CubeMX
・OS windows 10 pro
・本
定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ)
- 作者:芹井 滋喜
- 発売日: 2016/01/29
- メディア: 単行本
ハードウェアで工夫はしたことはあったのですが、ソフトウェアではあんまりしたことないな~と思いやってみよう。
チャタリングはこういうやつ→fpga-net.jp - このウェブサイトは販売用です! - 用語 エンジ パワー 入門 分野 初心者 回路 アップデート リソースおよび情報
まずはSTM32CubeMXの設定をします。
PC0をBUTTON0,PC1をLED0に設定しやっていきたいと思います。
基板上に青色のボタンがあるのですが・・・回路図を見たところどうやらチャタリング防止用みたいなRC回路が組んであったので使わないでやってみよう。
PC13と右側のスイッチの回路の部分。
次はサンプリングを使ったチャタリング防止方法。
/* Includes ------------------------------------------------------------------*/ #include "stm32f4xx_hal.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ #define SAMPLE_COUNT 30 // 30ms #define LED_PORT GPIOC #define LED_PIN GPIO_PIN_1 #define LED_ON GPIO_PIN_SET #define LED_OFF GPIO_PIN_RESET #define SW_PORT GPIOC #define SW_PIN GPIO_PIN_0 #define SW_OFF GPIO_PIN_SET #define SW_ON GPIO_PIN_RESET /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); void Error_Handler(void); static void MX_GPIO_Init(void); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ int SampleCount = 0; volatile int SwStatus = 0; void HAL_SYSTICK_Callback(void) { SampleCount++; if(SampleCount>=SAMPLE_COUNT){ SampleCount = 0; if(HAL_GPIO_ReadPin(SW_PORT, SW_PIN) == SW_ON){ // スイッチが押されている SwStatus = 1; }else{ SwStatus = 0; } } } void GetSwitch(void) { while(!SwStatus) ; // スイッチが押されるのを待つ while(SwStatus) ; // スイッチが離されるのを待つ } /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { GetSwitch(); HAL_GPIO_WritePin(LED_PORT, LED_PIN, LED_ON); GetSwitch(); HAL_GPIO_WritePin(LED_PORT, LED_PIN, LED_OFF); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
という感じで30msおきにHAL_SYSTICK_Callback関数を用いて、スイッチの状態をサンプリングして、それをもとにLEDを制御するプログラムです。
20160915の記事