STM32 F401RE チャタリング1
開発環境
・評価ボード 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と右側のスイッチの回路の部分。
まずはスイッチの変化を監視して、変化があった後ディレイを挿入してチャタリングを無視する方法。
・main.c
/* Includes ------------------------------------------------------------------*/ #include "stm32f4xx_hal.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ #define CHATTERING_OFF #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 #ifdef CHATTERING_OFF #define wait_delay() HAL_Delay(30) #else #define wai_delay() #endif /* 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 */ void GetSwitch(void) { while(HAL_GPIO_ReadPin(SW_PORT, SW_PIN) != SW_ON) ; // スイッチが押されるのを待つ wait_delay(); while(HAL_GPIO_ReadPin(SW_PORT, SW_PIN) != SW_OFF) ; wait_delay(); } /* 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 */ }
という感じで成功した。なんとなくボタンの反応が悪くなった気がする。
#define CHATTERING_OFFをコメントアウトすればチャタリング防止の遅延がなくなる。
20160915の記事