【STM32+HAL庫】使用通用定時器生成的PWM實現呼吸燈效果

hack747發表於2024-10-27
板子:STM32F103C8
模擬軟體:Proteus 8
軟體平臺:cubemx+keil

1 新建STM32CubeMX工程

1.1 配置系統時鐘RCC

1.2 配置定時器

這裡用的PB3和PA15一對

TIM2中,時鐘源選擇內部時鐘Internal Clock,通道1選擇PWM輸出PWM Generation CH1 通道2選擇PWM輸出PWM Generation CH2

2 程式碼

2.1 定義變數

uint16_t pulse=0;   /*佔空比,重灌載值設定為999*/
uint8_t flag=1;     /*LED標誌位,用於判斷是漸亮還是漸滅*/

2.2 mian函式

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();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
    //啟動定時器2通道1的PWM
    HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
    //啟動定時器2通道2的PWM
    HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
    
    uint16_t pulse=0;   /*佔空比,重灌載值設定為999*/
    uint8_t flag=1;     /*LED標誌位,用於判斷是漸亮還是漸滅*/

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

這裡下面是while 沒複製 就複製到這

while中程式碼編寫

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
            if (flag==1)    /*執行LED漸亮*/
    {
      if (pulse<1000)
      {
        pulse+=50;   /*佔空比增大*/
        __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,pulse);    /*修改佔空比*/
        HAL_Delay(100);
      }
      else
        flag=0;    /*切換為漸滅模式*/
    }
    else       /*執行LED漸滅*/
    {
      pulse-=50;    /*佔空比減小*/
      __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,pulse);    /*修改佔空比*/
      HAL_Delay(100);
      if (pulse==0)
      {
        flag=1;    /*切換為漸亮模式*/
      }
    }
  }

完事

相關文章