logo资料库

STM32 PWM占空比和频率调节程序.docx

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
#include "stm32f10x_lib.h" void RCC_cfg(); void GPIO_cfg(); void TIMER_cfg(); void PWM_cfg(); //占空比,取值范围为 0-100 int dutyfactor = 50; int main() { int Temp; RCC_cfg(); GPIO_cfg(); TIMER_cfg(); PWM_cfg(); //使能 TIM3 计时器,开始输出 PWM TIM_Cmd(TIM3, ENABLE); while(1); } void RCC_cfg() { //定义错误状态变量 ErrorStatus HSEStartUpStatus; //将 RCC 寄存器重新设置为默认值
RCC_DeInit(); //打开外部高速时钟晶振 RCC_HSEConfig(RCC_HSE_ON); //等待外部高速时钟晶振工作 HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { //设置 AHB 时钟(HCLK)为系统时钟 RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置高速 AHB 时钟(APB2)为 HCLK 时钟 RCC_PCLK2Config(RCC_HCLK_Div1); //设置低速 AHB 时钟(APB1)为 HCLK 的 2 分频 RCC_PCLK1Config(RCC_HCLK_Div2); //设置 FLASH 代码延时 FLASH_SetLatency(FLASH_Latency_2); //使能预取指缓存 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //设置 PLL 时钟,为 HSE 的 9 倍频 8MHz * 9 = 72MHz RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //使能 PLL
RCC_PLLCmd(ENABLE); //等待 PLL 准备就绪 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //设置 PLL 为系统时钟源 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //判断 PLL 是否是系统时钟 while(RCC_GetSYSCLKSource() != 0x08); } //开启 TIM3 的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //开启 GPIOB 的时钟和复用功能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE); } void GPIO_cfg() { GPIO_InitTypeDef GPIO_InitStructure; //部分映射,将 TIM3_CH2 映射到 PB5 // GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
//选择引脚 5 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //输出频率最大 50MHz GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //复用推挽输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB,&GPIO_InitStructure); } void TIMER_cfg() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //重新将 Timer 设置为缺省值 TIM_DeInit(TIM3); //采用内部时钟给 TIM3 提供时钟源 TIM_InternalClockConfig(TIM3); //预分频系数为 0,即不进行预分频,此时 TIMER 的频率为 72MHz TIM_TimeBaseStructure.TIM_Prescaler = 0; //设置时钟分割 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置计数器模式为向上计数模式 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数溢出大小,每计 7200 个数就产生一个更新事件,即 PWM 的输出频率 为 10kHz TIM_TimeBaseStructure.TIM_Period = 7200 - 1; //将配置应用到 TIM3 中
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); } void PWM_cfg() { TIM_OCInitTypeDef TimOCInitStructure; //设置缺省值 TIM_OCStructInit(&TimOCInitStructure); //PWM 模式 1 输出 TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //设置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100% TimOCInitStructure.TIM_Pulse = dutyfactor * 7200 / 100; //TIM 输出比较极性高 TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //使能输出状态 TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //TIM3 的 CH2 输出 TIM_OC2Init(TIM3, &TimOCInitStructure); //设置 TIM3 的 PWM 输出为使能 TIM_CtrlPWMOutputs(TIM3,ENABLE); }
分享到:
收藏