stm32f103利用pwm控制背光,但是pwm配置没配好,麻烦大神们帮忙看看,下面是配置代码

FNGLee 2015-11-16 10:46:30
void PWM_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM8_TimeBaseStructure;
TIM_OCInitTypeDef TIM8_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);//开启TIM8的时钟

//GPIO配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

//定时器配置
TIM8_TimeBaseStructure.TIM_Period =2000;//计数值2000
TIM8_TimeBaseStructure.TIM_Prescaler = 35999;
TIM8_TimeBaseStructure.TIM_ClockDivision = 0;
TIM8_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInit(TIM8, &TIM8_TimeBaseStructure);

//通道配置这里是用TIM8的通道1进行配置,对应的GPIO是PC6口
TIM8_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//模式一
TIM8_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//极性低(低电平有效)
TIM8_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//通道1输出使能
TIM8_OCInitStructure.TIM_Pulse =backlight;//占空比这里是想通过在中断服务函数里对全局变量backlight进行控制,以达到控制占空比的目的
TIM_OC1Init(TIM8,&TIM8_OCInitStructure);
TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable); ////使能TIM8在CCR1预装载寄存器

TIM_ARRPreloadConfig(TIM8, ENABLE);//使能TIM8在ARR上的预装载寄存器
TIM_ClearITPendingBit(TIM8, TIM_IT_CC1);//预先清除中断位

TIM_ITConfig(TIM8,TIM_IT_CC1,ENABLE);//使能中断位
TIM_Cmd(TIM8, ENABLE);//使能定时器
}
用示波器没有检测出PWM波,大神们帮忙看一下,配置有没有哪里错了,或者有哪些没有配置好的
...全文
351 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
guetcw 2015-12-18
  • 打赏
  • 举报
回复
以前的代码,驱动一个驼机+L298双直流电机用,楼主参考一下 void TIM2_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器3时钟 //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIO外设时钟 //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM2, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5 //设置该引脚为复用输出功能,输出TIM2 CH2的PWM脉冲波形 GPIO_InitStructure.GPIO_Pin = SERVO_PWM_PIN; //TIM2_CH2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO //初始化TIM2 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM2 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高 TIM_OC2Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM2 OC2 TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的预装载寄存器 TIM_Cmd(TIM2, ENABLE); //使能TIM3 } //TIM3 PWM部分初始化 //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟 //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIO外设时钟 //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5 //设置该引脚为复用输出功能,输出TIM3 CH1-CH3的PWM脉冲波形 GPIO_InitStructure.GPIO_Pin = MOTO_EN1_PWM_PIN; //TIM_CH1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO GPIO_InitStructure.GPIO_Pin = MOTO_EN2_PWM_PIN; //TIM_CH2 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO //初始化TIM3 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM3 Channel 1,2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低 TIM_OC1Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC1 TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR1上的预装载寄存器 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIM3 } void moto_drive_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF, ENABLE); //使能PE,PF端口时钟 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_InitStructure.GPIO_Pin = MOTO_IN1_PIN; //MOTO_IN1_PIN-->PE.0 端口配置 GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOE.0 //GPIO_SetBits(GPIOE,MOTO_IN1_PIN); //PE.0 输出高 GPIO_ResetBits(GPIOE,MOTO_IN1_PIN); //PE.0 输出低 GPIO_InitStructure.GPIO_Pin = MOTO_IN2_PIN; //MOTO_IN1_PIN-->PE.2 端口配置 GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOE.2 //GPIO_SetBits(GPIOE,MOTO_IN2_PIN); //PE.2 输出高 GPIO_ResetBits(GPIOE,MOTO_IN2_PIN); //PE.2 输出低 GPIO_InitStructure.GPIO_Pin = MOTO_IN3_PIN; //MOTO_IN1_PIN-->PE.4 端口配置 GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOE.4 //GPIO_SetBits(GPIOE,MOTO_IN3_PIN); //PE.4 输出高 GPIO_ResetBits(GPIOE,MOTO_IN3_PIN); //PE.4 输出低 GPIO_InitStructure.GPIO_Pin = MOTO_IN4_PIN; //MOTO_IN1_PIN-->PE.6 端口配置 GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOE.6 //GPIO_SetBits(GPIOE,MOTO_IN4_PIN); //PE.6 输出高 GPIO_ResetBits(GPIOE,MOTO_IN4_PIN); //PE.6 输出低 /*GPIO_InitStructure.GPIO_Pin = MOTO_EN1_PIN; //MOTO_IN1_PIN-->PF.0 端口配置 GPIO_Init(GPIOF, &GPIO_InitStructure); //根据设定参数初始化GPIOF.0 //GPIO_SetBits(GPIOE,MOTO_EN1_PIN); //PF.0 输出高 GPIO_ResetBits(GPIOE,MOTO_EN1_PIN); //PF.0 输出低 GPIO_InitStructure.GPIO_Pin = MOTO_EN2_PIN; //MOTO_IN2_PIN-->PF.2 端口配置 GPIO_Init(GPIOF, &GPIO_InitStructure); //根据设定参数初始化GPIOF.2 //GPIO_SetBits(GPIOE,MOTO_EN2_PIN); //PF.2 输出高 GPIO_ResetBits(GPIOE,MOTO_EN2_PIN); */ //PF.2 输出低 TIM2_PWM_Init(SERVO_PWM_ARR-1, SERVO_PWM_PSC); TIM3_PWM_Init(MOTO_PWM_ARR-1, MOTO_PWM_PSC); TIM_SetCompare2(TIM2,SERVO_PWM_ARR*75/1000); //舵机占空比7.5%,脉宽1.5ms,角度0度 TIM_SetCompare1(TIM3,MOTO_PWM_ARR/2); //电机1占空比50% TIM_SetCompare2(TIM3,MOTO_PWM_ARR/2); //电机2占空比50% }
Aexisun 2015-12-16
  • 打赏
  • 举报
回复
为什么用高级定时器
默寞 2015-12-16
  • 打赏
  • 举报
回复
不要中断 看一下stm的例程对比下

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧