OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3734|回复: 4

改一个PWM为舵机的驱动 编译无错误无警告 但是DEBUG示波器里看不到应有的波形 求解答

[复制链接]

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-3-7
在线时间
0 小时
发表于 2015-3-19 07:55:04 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]#include "Servo.h" void TIM2_PWM_Init(uint16_t Arr,uint16_t Psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM2, ENABLE); //Timer2部分重映射 TIM2_CH2->B3 //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //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_TimeBaseInitStructure.TIM_Period = Arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseInitStructure.TIM_Prescaler =Psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseInitStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //根据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_High; //输出极性:TIM输出比较极性高 TIM_OC2Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2 TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器 TIM_Cmd(TIM2, ENABLE); //使能TIM3 } [/mw_shl_code]
以上为舵机驱动

[mw_shl_code=c,true]#include "stm32f10x.h" #include "Servo.h" void Delay(__IO uint32_t nCount) { for(; nCount != 0; nCount--); } int main() { TIM2_PWM_Init(199,7199); while(1) { TIM_SetCompare2(TIM2,5); // Delay(0x0fffee); // TIM_SetCompare2(TIM2,15); // Delay(0x0fffee); // TIM_SetCompare2(TIM2,20); // Delay(0x0fffee); // TIM_SetCompare2(TIM2,15); // Delay(0xffffee); // TIM_SetCompare2(TIM2,5); // Delay(0xffffee); } } [/mw_shl_code]
以上为主程序
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-3-7
在线时间
0 小时
 楼主| 发表于 2015-3-19 08:27:26 | 显示全部楼层
加了一句TIM_ARRPreloadConfig(TIM2, ENABLE);    // 使能TIM3重载寄存器ARR
取消主程序部分注释 但是好像只在执行TIM_SetCompare2(TIM2,5);这一句 
这是怎么回事啊
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-3-7
在线时间
0 小时
 楼主| 发表于 2015-3-19 08:46:37 | 显示全部楼层
调好了 占空比太低 波形不明显 没看出来
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-3-7
在线时间
0 小时
 楼主| 发表于 2015-3-19 08:49:03 | 显示全部楼层
主程序

[mw_shl_code=c,true]#include "stm32f10x.h" #include "Servo.h" void Delay(__IO uint32_t nCount) { for(; nCount != 0; nCount--); } int main() { TIM2_PWM_Init(199,7199); while(1) { TIM_SetCompare2(TIM2,5); Delay(0xffffee); TIM_SetCompare2(TIM2,20); Delay(0xffffee); TIM_SetCompare2(TIM2,40); Delay(0xffffee); TIM_SetCompare2(TIM2,60); Delay(0xffffee); TIM_SetCompare2(TIM2,5); Delay(0xffffee); } } [/mw_shl_code]



舵机驱动PWM


[mw_shl_code=c,true]#include "Servo.h" void TIM2_PWM_Init(uint16_t Arr,uint16_t Psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM2, ENABLE); //Timer2部分重映射 TIM2_CH2->B3 //设置该引脚为复用输出功能,输出TIM2 CH2的PWM脉冲波形 GPIOB.3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //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_TimeBaseInitStructure.TIM_Period = Arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseInitStructure.TIM_Prescaler =Psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseInitStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //根据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_ARRPreloadConfig(TIM2, ENABLE);// 使能TIM3重载寄存器ARR TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的预装载寄存器 TIM_Cmd(TIM2, ENABLE); //使能TIM3 } [/mw_shl_code]

回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-3-7
在线时间
0 小时
 楼主| 发表于 2015-3-19 08:51:15 | 显示全部楼层
注释有点问题 用的是TIM2
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 16:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表