CCWO Embedded Space

CCWOの日々の開発を発信するブログ

STM32 F401RE チャタリング1

開発環境
・評価ボード NUCLEO-F401RE
・IDE MDK-ARM V5 and STM32CubeMX
・OS windows 10 pro
・本

チャタリングの章があったのでやってみたいと思います。
ハードウェアで工夫はしたことはあったのですが、ソフトウェアではあんまりしたことないな~と思いやってみよう。
チャタリングはこういうやつ→fpga-net.jp - このウェブサイトは販売用です! - 用語 エンジ パワー 入門 分野 初心者 回路 アップデート リソースおよび情報
まずはSTM32CubeMXの設定をします。
f:id:CCWO:20160915155339p:plain
PC0をBUTTON0,PC1をLED0に設定しやっていきたいと思います。
基板上に青色のボタンがあるのですが・・・回路図を見たところどうやらチャタリング防止用みたいなRC回路が組んであったので使わないでやってみよう。
f:id:CCWO:20160915155645p:plain
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をコメントアウトすればチャタリング防止の遅延がなくなる。
f:id:CCWO:20160915171349j:plain

20160915の記事