久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 16581|回復: 1
打印 上一主題 下一主題
收起左側

STM32編程輸出可調的硬件PWM,頻率范圍1Hz-1MHz,占空比0-100%

[復制鏈接]
跳轉到指定樓層
樓主
ID:100029 發表于 2015-12-22 19:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
【原創】編程輸出可調的硬件PWM,頻率范圍1Hz-1MHz,占空比0-100%

uint32_t TIM4_PWM_FQ = 50;             /* TIM4_CH1_PWM輸出 頻率設置值,1-1000000 */
uint32_t TIM4_PWM_FQ_Old  = 0;
uint16_t TIM4_PWM_Pulse = 50;          /* TIM4_CH1_PWM輸出 占空比設置值,0-100 */
uint16_t TIM4_PWM_Pulse_Old = 0;

uint32_t SystemCoreClock = 168000000;

/*
* 函數功能: 定時器4配置為硬件PWM模式(不開啟TIM4的定時及DMA傳輸中斷)
* TIM4_PWM_FQ:     TIM4_CH1_PWM 頻率    1Hz至1000000Hz
* TIM4_PWM_Pulse:  TIM4_CH1_PWM 占空比  0-100%
*/
void StdPeriph_TIM4_PWM_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
  
    uint32_t temp32;
    uint32_t uhTimerfrequency;
    uint16_t uhTimerPeriod;
    uint16_t uhTimerPulse;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

#ifdef USE_PB6_PWM
    // TIM4_CH1_PWM: PB6
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

    // GPIOB Configuration
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_TIM4);
#else
    // TIM4_CH1_PWM: PD12
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  
    // GPIOD Configuration
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);
#endif
    uhTimerfrequency = 200000; /* 初始化 200KHz */
    temp32 = ((SystemCoreClock /2) / uhTimerfrequency);
    if(temp32 > 65535) temp32 = 65535;
    uhTimerPeriod = (uint16_t) temp32;
    uhTimerPulse  = uhTimerPeriod * 50 / 100; /* 占空比50% */

    // Time base configuration
    TIM_TimeBaseStructure.TIM_Period = uhTimerPeriod - 1; /* 0x0000 and 0xFFFF */
    TIM_TimeBaseStructure.TIM_Prescaler = 0; /* 0x0000 and 0xFFFF */
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

    // PWM1 Mode configuration: Channel1
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = uhTimerPulse;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

    TIM_OC1Init(TIM4, &TIM_OCInitStructure);
    TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
    TIM_ARRPreloadConfig(TIM4, ENABLE);
    TIM_GenerateEvent(TIM4, TIM_EventSource_Update);

    TIM_Cmd(TIM4, ENABLE);
}

/*
* 函數功能: 刷新TIM4_CH1_PWM輸出的頻率和占空比
* 修改TIM4_PWM_FQ的值,調節PWM頻率(1Hz至1MHz)
* 修改TIM4_PWM_Pulse的值,調節PWM的占空比(0-100)
*/

void StdPeriph_TIM4_PWM_Update(void)
{
  uint32_t temp32;
  uint32_t uhTimerfrequency;
  uint16_t uhTimerPeriod;
  uint16_t uhTimerPrescaler;
  uint16_t uhTimerPulse;

  if ((TIM4_PWM_FQ_Old != TIM4_PWM_FQ) || (TIM4_PWM_Pulse_Old != TIM4_PWM_Pulse)){
    TIM4_PWM_FQ_Old = TIM4_PWM_FQ;
    TIM4_PWM_Pulse_Old = TIM4_PWM_Pulse;
    if(TIM4_PWM_FQ >= 4000){
      uhTimerfrequency = TIM4_PWM_FQ;  /* 定時器計時頻率和PWM頻率相等 */
      uhTimerPrescaler = 1;    /* 實際頻率TIM4_PWM_FQ較大時,TIM4設置分頻為1(不分頻)   */
    }else{
      uhTimerfrequency = 4000; /* 實際頻率TIM4_PWM_FQ較小時,和4000Hz的頻率比較,看相差幾倍 */
      uhTimerPrescaler = 4000 / TIM4_PWM_FQ;  /* 實際頻率和4000相差的倍數作為TIM4的分頻設置值 */
      uhTimerfrequency = uhTimerPrescaler * TIM4_PWM_FQ; /* TIM4分頻后,計時周期變長,需要將uhTimerfrequency倍頻  */
    }

    /* TIM4的周期要通過倍頻uhTimerfrequency來計算,uhTimerPeriod = 84MHz / uhTimerfrequency */
    temp32 = ((SystemCoreClock /2) / uhTimerfrequency);
    if(temp32 > 65535) temp32 = 65535;
    uhTimerPeriod = (uint16_t) temp32;

    if(TIM4_PWM_Pulse > 100) TIM4_PWM_Pulse = 100;
    uhTimerPulse = uhTimerPeriod * TIM4_PWM_Pulse/ 100;
   
    TIM4->ARR  = uhTimerPeriod - 1;
    TIM4->PSC  = uhTimerPrescaler - 1;
    TIM4->CCR1 = uhTimerPulse;
    TIM4->EGR  = TIM_PSCReloadMode_Update;
  }
}




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

使用道具 舉報

沙發
ID:326374 發表于 2018-5-9 22:24 | 只看該作者
樓主你好,請問有工程代碼打包嗎?能給個下載鏈接不?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费成人高清在线视频 | 免费午夜电影 | 国产免费一区二区三区网站免费 | 国产精品一区二区免费 | 精品国产伦一区二区三区观看说明 | 亚洲一区二区三区在线视频 | a级在线免费 | 免费视频99 | 99免费在线观看视频 | 一区二区三区四区视频 | 剑来高清在线观看 | 黑人巨大精品欧美黑白配亚洲 | 91麻豆精品国产91久久久久久久久 | 日韩福利片 | 中文字幕一区二区三区精彩视频 | 国产一区二区在线免费观看 | 日本视频在线播放 | av免费网址 | 天天影视网天天综合色在线播放 | 99久久精品免费 | 高清一区二区三区 | 日韩中文字幕 | 粉嫩一区二区三区性色av | 91偷拍精品一区二区三区 | 国产区在线观看 | 成人免费视频网址 | 欧美国产日韩在线 | 国产精品片aa在线观看 | 国产亚洲一区二区三区在线观看 | 操操操操操 | 国产高清区 | 99久久精品免费看国产四区 | 成人av观看| 在线一区视频 | 久久99精品久久久久久国产越南 | 欧美黑人一区二区三区 | 欧美一级视频在线观看 | 高清视频一区二区三区 | 国产精品成av人在线视午夜片 | 中文字幕国产 | 男女羞羞网站 |