找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 5099|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STM32F103互補(bǔ)PWM帶死區(qū)頻率占空比可調(diào)源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:85785 發(fā)表于 2019-8-29 08:35 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
最近做了STM32F103互補(bǔ)PWM帶死區(qū)頻率占空比可調(diào),現(xiàn)在來(lái)分享一下。
從STM32的datashee可以看到下圖

互補(bǔ)PWM我現(xiàn)在選擇的是TIM1的通道1通道2通道3
上圖可看出復(fù)用腳PA6 PA7 PB0 PB1
不復(fù)用的腳PB12 PB13 PB14 PB15,可以根據(jù)自己的引腳需求選擇復(fù)用或者不復(fù)用,這些腳是輸出互補(bǔ)的引腳,正向PWM引腳為PA8 PA9 PA10 PA11
這個(gè)功能其實(shí)也挺簡(jiǎn)單的,下面直接看附件代碼。

單片機(jī)源程序如下:
  1. #include "PWM_Deadline.h"

  2. uint16_t CC1_Value = 1000,CC2_Value = 10000,CC3_Value = 20000;

  3. void TIM3_PWMShiftInit(void)
  4. {
  5.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  6.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  7.         GPIO_InitTypeDef  GPIO_InitStruct;
  8.         TIM_BDTRInitTypeDef      TIM1_BDTRInitStruct;
  9.        
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
  12.        
  13.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  14.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_6 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
  15.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  16.         GPIO_Init(GPIOA,&GPIO_InitStruct);
  17.        
  18.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  19.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  20.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  21.         GPIO_Init(GPIOB,&GPIO_InitStruct);
  22.        
  23.         GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE);
  24. ////        GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE);
  25.         //TIM1_TIM2_TIM16
  26.         TIM_TimeBaseStructure.TIM_Period = 65534;//計(jì)數(shù)1000
  27.         TIM_TimeBaseStructure.TIM_Prescaler = 71;//48/n
  28.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  29.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  30.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  31.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  32.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  33.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  34.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  35.         TIM_OCInitStructure.TIM_Pulse = 100;
  36.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  37.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  38.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  39.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  40.        
  41.         //配置死區(qū)
  42.         TIM1_BDTRInitStruct.TIM_OSSRState = TIM_OSSRState_Disable;
  43.         TIM1_BDTRInitStruct.TIM_OSSIState = TIM_OSSIState_Disable;
  44.         TIM1_BDTRInitStruct.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
  45.         TIM1_BDTRInitStruct.TIM_DeadTime = 10;
  46.         TIM1_BDTRInitStruct.TIM_Break = TIM_Break_Disable;
  47.         TIM1_BDTRInitStruct.TIM_BreakPolarity = TIM_BreakPolarity_High;
  48.         TIM1_BDTRInitStruct.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
  49.         TIM_BDTRConfig(TIM1,&TIM1_BDTRInitStruct);

  50. //        TIM_OCInitStructure.TIM_Pulse = 900;
  51. //        TIM_ICInit(TIM1, &TIM_OCInitStructure);
  52. //        TIM_CCPreloadControl(TIM1, TIM_OCPreload_Enable);

  53.   TIM_OCInitStructure.TIM_Pulse = CC1_Value;
  54.         TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  55.         TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
  56. //        TIM_Cmd(TIM1, ENABLE);
  57. //        TIM_CtrlPWMOutputs(TIM1, ENABLE);
  58.        
  59.         TIM_OCInitStructure.TIM_Pulse = CC2_Value;
  60.         TIM_OC2Init(TIM1, &TIM_OCInitStructure);//CH4可以正確輸出,但CH1不行,全速轉(zhuǎn)動(dòng),為什么?
  61.         TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
  62.        
  63.         TIM_OCInitStructure.TIM_Pulse = CC3_Value;
  64.         TIM_OC3Init(TIM1, &TIM_OCInitStructure);
  65.         TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
  66.        
  67.         TIM_Cmd(TIM1, ENABLE);
  68.         TIM_CtrlPWMOutputs(TIM1, ENABLE);
  69.        
  70. //        TIM_ITConfig(TIM1, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3, ENABLE);
  71.        
  72. //        TIM_ARRPreloadConfig(TIM1, ENABLE);

  73. }

  74. uint16_t Fre;
  75. void Dynami_Fre(void)
  76. {
  77.         TIM1->ARR = Fre;   //可調(diào)頻率
  78.         if (Fre > 10000) Fre = 10000;
  79.         if (Fre < 1000) Fre = 1000;
  80.         Fre ++;
  81.         TIM_SetCompare1(TIM1, 100);  //占空比 = 100 / TIM1->ARR;
  82.         TIM_SetCompare2(TIM1, 200);  //占空比 = 200 / TIM1->ARR;
  83.         TIM_SetCompare3(TIM1, 300);  //占空比 = 300 / TIM1->ARR;
  84.        
  85. }


  86. uint16_t value1 = 0;
  87. void TIM1_CC_IRQHandler(void)
  88. {
  89.         uint16_t capture;
  90.         if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
  91.         {
  92.                 TIM_ClearITPendingBit(TIM1, TIM_IT_CC1 );
  93.                 capture = TIM_GetCapture1(TIM1);
  94.                 if (value1 > 20000) value1 = 20000;
  95.                 TIM_SetCompare1(TIM1, 10000);
  96.                 TIM1->ARR = 15000;
  97.         }
  98. //        if (TIM_GetITStatus(TIM1, TIM_IT_CC2) != RESET)
  99. //        {
  100. //                TIM_ClearITPendingBit(TIM1, TIM_IT_CC2 );
  101. //                capture = TIM_GetCapture2(TIM1);
  102. //                if (value1 > 20000) value1 = 20000;
  103. //                TIM_SetCompare1(TIM1, capture + CC2_Value/2);
  104. //        }
  105. //        if (TIM_GetITStatus(TIM1, TIM_IT_CC3) != RESET)
  106. //        {
  107. //                TIM_ClearITPendingBit(TIM1, TIM_IT_CC3 );
  108. //                capture = TIM_GetCapture3(TIM1);
  109. //                if (value1 > 20000) value1 = 20000;
  110. //                TIM_SetCompare1(TIM1, capture + CC3_Value/2);
  111. //        }
  112. }

  113. void NVIC_Configuration(void)
  114. {
  115. NVIC_InitTypeDef NVIC_InitStructure;




  116. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


  117. NVIC_InitStructure.NVIC_IRQChannel=TIM1_CC_IRQn;
  118. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
  119. NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
  120. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  121. NVIC_Init(&NVIC_InitStructure);
  122. }
復(fù)制代碼

所有資料51hei提供下載:
master.7z (303.03 KB, 下載次數(shù): 97)



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:71535 發(fā)表于 2019-9-16 19:36 | 只看該作者

看看是什么寶貝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表