CCWO Embedded Space

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

STM32 F401RE チャタリング2

開発環境
・評価ボード 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と右側のスイッチの回路の部分。
次はサンプリングを使ったチャタリング防止方法。

/* 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の記事