数字舵机 vs 模拟舵机 “数字舵机区别于传统的模拟舵机,模拟舵机需要给它不停的发送PWM信号,才能让它保持在规定的位置或者让它按照某个速度转动,数字舵机则只需要发送一次PWM信号就能保持在规定的某个位置。”
"到底模拟舵机与数码舵机在实际使用中有什么区别呢?我自己总结大致有以下几点:
1 数码舵机在位置准确度方面要高于模拟舵机。
2 在同样标称1.6公斤的舵机面前数码舵机在实际表现中会感觉更加“力气大”而模拟舵机就会“肉”点。
3 模拟舵机由于控制芯片是模拟电路,所以即便是相同型号的舵机会存在小小的性能差异,而数码舵机在一致性方面就非常好。
4 数码舵机一般均采用PID优化算法,所以,线性要好过模拟舵机。
5 对于高灵敏度的控制,建议选择数码舵机,如直升机的控制,高速固定翼飞机,高速滑翔机,比赛用车膜型,云台的控制等
6 对于不是特别需要灵敏度的场合,如低速固定翼(二战飞机,练习机,低速滑翔机等),船模,娱乐用车模等。可以考虑模拟舵机。
"(http://www.321mx.com/blog/548.html)
基本上参考《STM32不完全手册——库函数版本》
pwm.c 初始化函数
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE);// 使能定时器时钟TIM2/TIM3/TIM4
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE); //使能GPIOA/GPIOB外设时钟使能
//设置该引脚为复用输出功能,输出TIM2 CH3(PA2复用输出)、TIM2 CH4(PA3复用输出)的PWM脉冲波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //TIM2_CH3(PA2复用输出)、TIM2 CH4(PA3复用输出)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9; //TIM3的3、4通道,TIM4的3、4通道
GPIO_Init(GPIOB,&GPIO_InitStructure); //B口的0、1对应TIM3的3、4通道,B口的8、9对应TIM4的3、4通道,设置为复用推挽输出
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 50HZ
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的时间基数单位
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC3Init(TIM2, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //CH3预装载使能
TIM_OC4Init(TIM2, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable); //CH4预装载使能
TIM_OC3Init(TIM3, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //CH3预装载使能
TIM_OC4Init(TIM3, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); //CH4预装载使能
TIM_OC3Init(TIM4, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //CH3预装载使能
TIM_OC4Init(TIM4, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //CH4预装载使能
TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_CtrlPWMOutputs(TIM2,ENABLE); //MOE 主输出使能
TIM_Cmd(TIM2, ENABLE); //使能TIM2
TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_CtrlPWMOutputs(TIM3,ENABLE); //MOE 主输出使能
TIM_Cmd(TIM3, ENABLE); //使能TIM3
TIM_ARRPreloadConfig(TIM4, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_CtrlPWMOutputs(TIM4,ENABLE); //MOE 主输出使能
TIM_Cmd(TIM4, ENABLE); //使能TIM4
}
int main(void)
{
u16 pwmval1=749;//1.5ms->90度
delay_init(); //延时函数初始化
TIM_PWM_Init(9999,143);//不分频。PWM 频率=72*10^6/(9999+1)/(143+1)=50Hz
while(1)
{
//调节占空比pwmval1/(9999+1)
TIM_SetCompare3(TIM2,pwmval1);TIM_SetCompare4(TIM2,pwmval1);
TIM_SetCompare3(TIM3,pwmval1);TIM_SetCompare4(TIM3,pwmval1);
TIM_SetCompare3(TIM4,pwmval1);TIM_SetCompare4(TIM4,pwmval1);
}
}
以下转自:http://www.cnblogs.com/ghdnui/articles/3429732.html
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4 , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //TIM3的1、2通道 ,产生PWM
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure); //PA的6,7口对应TIM3的1、2通道,设置为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; //TIM4的1、2、3、4通道
GPIO_Init(GPIOB,&GPIO_InitStructure); //B口的6,7,8,9对应TIM4的1、2、3、4通道,设置为复用推挽输出
TIM_TimeBaseStructure.TIM_Period =9999; //自动重载周期值
TIM_TimeBaseStructure.TIM_Prescaler =143; //预分频值 ,这里是50HZ
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数摸式为向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //TIM3,和TIM4用的相同配置,写入配置 ,PWM频率为50HZ
//设定占空比
TIM_OCStructInit(& TIM_OCInitStructure); //恢复初始
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //定时器模式为pwm模式1
TIM_OCInitStructure.TIM_Pulse =0; //脉冲值,即输出都是低电平
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //极性为高
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //将配置数据写入TIM3的通道1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //预装载使能
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC1Init(TIM4, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC2Init(TIM4, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC3Init(TIM4, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC4Init(TIM4, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);//TIM4的4个通道都用相同的配置
TIM_Cmd(TIM3, ENABLE);
TIM_CtrlPWMOutputs(TIM3, ENABLE);
TIM_Cmd(TIM4, ENABLE);
TIM_CtrlPWMOutputs(TIM4, ENABLE); //使能PWM模式
}
void SetJointAngle(u8 ID, float angle)
{
switch(ID)
{
case 0: //-90°~90°
angle=angle+90.0;
angle=(u16)(50.0*angle/9.0+249.0);
TIM_SetCompare1(TIM3,angle);
break;
//0°~180°
case 1:
angle=(u16)(4.175*angle+409.25);
TIM_SetCompare2(TIM3,angle);
break;
case 2: //-150°~0°
angle=-angle;
angle=(u16)(4.175*angle+480.0);
TIM_SetCompare1(TIM4,angle);
break;
case 3:
angle=-180-angle;
angle=-angle;
angle=(u16)(4.175*angle+315.0);
TIM_SetCompare2(TIM4,angle);
break;
//-90°~90°
case 4:
angle=90.0+angle;
上一篇:STM32自学笔记——定时器及PWM输出
下一篇:STM32通用定时器TIM实现PWM波配置步骤
推荐阅读最新更新时间:2024-11-17 14:20
设计资源 培训 开发板 精华推荐
- LTC2636-HMX10 八通道、10 位数模转换器的典型应用
- 无刷电调_CW32
- TWR-K60D100M,Kinetis K60 100 MHz MCU 塔式系统模块,采用 MK60DN512VMD10-an ARM Cortex-M4
- ADA4610-4ARZ 正峰值检波器运算放大器的典型应用电路
- 使用 NXP Semiconductors 的 TDA3616 的参考设计
- SY58032U,用于 GB 以太网交换机的时钟缓冲器的评估板
- 浴室门禁系统2.0
- QuarkNPi
- NHS3152THADADK: NHS3152治疗依从性入门套件
- DC951A,演示电路采用 LTC2481、16 位高性能 DS 模数转换器