精华内容
参与话题
问答
  • PWM舵机控制教程

    2018-11-19 21:00:55
    PWM舵机控制教程舵机(英文叫Servo):它由直流电机、减速齿轮组、传感器和控制电路组成的一套自动控制系统。通过发送信号,指定输出轴旋转角度。舵机一般而言都有最大旋转角度(比如180度。)与普通直流电机的区别...
  • 单片机PWM舵机控制原理

    万次阅读 多人点赞 2017-05-02 09:17:02
    舵机控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的: 0.5ms--------------0度; 1.0ms------------45度; ...

    舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的:
    0.5ms--------------0度;
    1.0ms------------45度;
    1.5ms------------90度;
    2.0ms-----------135度;
    2.5ms-----------180度;

     

    如下图可形象地表示脉冲与角度关系

     



    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. #include <reg52.h>  
    2. unsigned char count;            //0.5ms次数标识  
    3. sbit pwm=P1^0;              //信号输出  
    4. sbit jia=P1^1;              //角度增加按键  
    5. sbit jan=P1^2;              //角度减小按键  
    6. char jd;                    //角度标识  
    7. void delay(unsigned int i)  
    8. {  
    9.     unsigned int j,k;  
    10.     for(j=i;j>0;j--)  
    11.         for(k=125;k>0;k--);  
    12. }  
    13. void Time0_init()           //定时器初始化  
    14. {  
    15.     TMOD=0x01;  
    16.     IE=0x82;  
    17.     TH0=0xff;  
    18.     TL0=0x19;               //12晶振,0.25ms  
    19.     TR0=1;                 //定时器开始  
    20. }  
    21. void Time0_int() interrupt 1            //中断程序  
    22. {  
    23.     TH0=0xff;  
    24.     TL0=0x19;  
    25.     if(count<jd) //输出count个高电平  
    26.         pwm=1;  
    27.     else  
    28.     pwm=0;    //其余输出低电平  
    29.     count++;  
    30.     count=count%40;  //时钟保持40个count 即20ms  
    31. }  
    32. void keyscan()              //按键扫描  
    33. {  
    34.     if(jia==0)              //角度增加键是否按下  
    35.     {  
    36.         delay(50);          //按下延时,消抖  
    37.         if(jia==0)  
    38.         {  
    39.             jd++;           //角度标识加1  
    40.             count=0;        //按键按下,则20ms周期重新开始  
    41.             if(jd==50)  
    42.                 jd=9;            //已经是180°则保持  
    43.                 while(jia==0);   //等待按键放开  
    44.         }  
    45.     }  
    46.     if(jan==0)                   //角度减小键是否按下  
    47.     {  
    48.         delay(10);  
    49.         if(jd==0);  
    50.         {  
    51.             jd--;                //角度标识减1  
    52.             count=0;  
    53.             if(jd==0)  
    54.                 jd=1;  
    55.             while(jan==0);  
    56.         }  
    57.     }  
    58. }  
    59.   
    60. void main()  
    61. {  
    62.     jd=1;  
    63.     count=0;  
    64.     Time0_init();  
    65.     while(1)  
    66.     {  
    67.         keyscan();  
    68. //      display();  
    69.     }  
    70. }  
    展开全文
  • TQ2440裸机开发舵机...1.利用Timer1的PWM功能实现TOUT1输出舵机控制信号;2.模仿C51程序,Timer1定时并设置Timer1中断,中断函数控制GPA0输出PWM信号。上述2个程序均利用串口接收键盘输入,键盘+和-,控制舵机转角。
  • proteus 仿真 单片机 舵机控制仿真单片机 型号AT89C52
  • PYB——PWM舵机控制

    2020-07-01 23:29:26
    其工作原理是由控制器发出PWM(脉冲宽度调制)信号给舵机,经电路板上的IC处理后计算出转动方向,再驱动无核心马达转动, 透过减速齿轮将动力传至摆臂,同时由位置检测器(电位器)返回位置信号,判断是否已经到达...

    舵机简介

    舵机,又称伺服马达,是一种具有闭环控制系统的机电结构。舵机主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。 其工作原理是由控制器发出PWM(脉冲宽度调制)信号给舵机,经电路板上的IC处理后计算出转动方向,再驱动无核心马达转动, 透过减速齿轮将动力传至摆臂,同时由位置检测器(电位器)返回位置信号,判断是否已经到达设定位置,一般舵机只能旋转180度。
    在这里插入图片描述

    舵机的接线

    舵机有3根线,棕色为地,红色为电源正,橙色为信号线,但不同牌子的舵机,线的颜色可能不同。

    舵机的控制原理

    舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的。

    • 占空比:
      1.指高电平在一个周期之内所占的时间比率。
      2.正脉冲的持续时间与脉冲总周期的比值。例如:正脉冲宽度1μs,信号周期10μs的脉冲序列占空比为0.1。即:脉冲的宽度除以脉冲的周期称为占空比。标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms之间,但是,事实上脉宽可由0.5ms2.5ms之间,脉宽和舵机的转角0°~180°相对应。

    接线

    在这里插入图片描述

    代码

    from pyb import Pin, Timer
    
    p = Pin('X1') # X1 has TIM2, CH1
    tim = Timer(2, freq=50) #脉冲周期为20ms,频率为50hz
    ch = tim.channel(1, Timer.PWM, pin=p)
    #旋转0°~180°,对应0.5ms/20ms——2.5ms/20ms的单个脉冲占空比。
    ch.pulse_width_percent(2.5) #0°
    ch.pulse_width_percent(12.5) #180°
    

    如果读者按照博主的教程学会了传感器的使用,不要忘了点个赞哦~

    展开全文
  • 很简单的东西一直没被弄出来,程序还有待进一步理解,现在已经调试成功。有需要控制舵机旋转角度的请自行下载啊
  • stm32 12路pwm舵机控制

    千次阅读 2018-10-15 14:58:34
    用于以pwm信号控制模拟舵机 使用 //@stm32f103 72mhz PWM_Init(1000-1,1440-1);//开12路pwm 50hz,arr=1000 RATIO_0(150);//设置位置,对模拟舵机CCR:100右极限,200左极限 h文件 #ifndef __pwm_H #define __pwm_H ...

    用于以pwm信号控制模拟舵机
    使用

    //@stm32f103 72mhz
    PWM_Init(1000-1,1440-1);//开12路pwm 50hz,arr=1000
    RATIO_0(150);//设置位置,对模拟舵机CCR:100右极限,200左极限 
    

    h文件

    #ifndef __pwm_H
    #define __pwm_H
    #include "sys.h"
    /*
    使用
    PWM_Init(1000-1,1440-1);//开12路pwm 50hz,arr=1000,对模拟舵机
    CCR:100右极限,200左极限 RATIO_0(150);//...
    */
    #define RATIO_0(RATIO) TIM_SetCompare1(TIM3, RATIO)   // PA6
    #define RATIO_1(RATIO) TIM_SetCompare2(TIM3, RATIO)   // PA7
    #define RATIO_2(RATIO) TIM_SetCompare3(TIM3, RATIO)   // PB0
    #define RATIO_3(RATIO) TIM_SetCompare4(TIM3, RATIO)   // PB1
    #define RATIO_4(RATIO) TIM_SetCompare1(TIM4, RATIO)   // PB6
    #define RATIO_5(RATIO) TIM_SetCompare2(TIM4, RATIO)   // PB7
    #define RATIO_6(RATIO) TIM_SetCompare3(TIM4, RATIO)   // PB8
    #define RATIO_7(RATIO) TIM_SetCompare4(TIM4, RATIO)   // PB9
    #define RATIO_8(RATIO) TIM_SetCompare1(TIM5, RATIO)   // PA0
    #define RATIO_9(RATIO) TIM_SetCompare2(TIM5, RATIO)   // PA1
    #define RATIO_10(RATIO) TIM_SetCompare3(TIM5, RATIO)  // PA2
    #define RATIO_11(RATIO) TIM_SetCompare4(TIM5, RATIO)  // PA3
    
    void PWM_Init(u16 arr, u16 psc);  //频率为7200000/psc/arr
    #endif
    
    // TIM_SetCompare2(TIM3,led0pwmval);调占空比
    
    

    c文件

    #include "pwm.h"
    
    //TIM_SetCompare2(TIM3,led0pwmval);调占空比
    //PWM频率 = 72M / ((arr+1)*(psc+1))(单位:Hz)
    //PWM占空比 = TIM3->CCR1 / arr(单位:%)
    
    //TIM3 TIM4 TIM5 12路 PWM初始化 
    //PWM输出初始化
    //arr:自动重装值
    //psc:时钟预分频数
    void PWM_Init(u16 arr,u16 psc)
    {  
    	GPIO_InitTypeDef GPIO_InitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	TIM_OCInitTypeDef  TIM_OCInitStructure;
    	
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3|RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM5, ENABLE);	//使能定时器345时钟
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
    	
       //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形	GPIOA.7
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_6|GPIO_Pin_7; //A组上管脚
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA组
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//B组上管脚
    	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB组
     
       //初始化TIM3,4,5
    	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的时间基数单位
    	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    	TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    	
    	//初始化TIM3,4,5 Channel,2,3,4 PWM模式	 
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
     	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    	//根据T指定的参数初始化外设通道,共12个
    	TIM_OC1Init(TIM3, &TIM_OCInitStructure);
    	TIM_OC2Init(TIM3, &TIM_OCInitStructure);
    	TIM_OC3Init(TIM3, &TIM_OCInitStructure);
    	TIM_OC4Init(TIM3, &TIM_OCInitStructure);
    	TIM_OC1Init(TIM4, &TIM_OCInitStructure);
    	TIM_OC2Init(TIM4, &TIM_OCInitStructure);
    	TIM_OC3Init(TIM4, &TIM_OCInitStructure);
    	TIM_OC4Init(TIM4, &TIM_OCInitStructure);
    	TIM_OC1Init(TIM5, &TIM_OCInitStructure);
    	TIM_OC2Init(TIM5, &TIM_OCInitStructure);
    	TIM_OC3Init(TIM5, &TIM_OCInitStructure);
    	TIM_OC4Init(TIM5, &TIM_OCInitStructure);
    	//使能TIM 在CCR1,2,3,4上的预装载寄存器
    	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
    	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
    	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
    	TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
    	TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
    	TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
    	TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
    	TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
    	TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);
    	TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable);
    	TIM_OC3PreloadConfig(TIM5, TIM_OCPreload_Enable);
    	TIM_OC4PreloadConfig(TIM5, TIM_OCPreload_Enable);
    
    	//使能TIM3,4,5
    	TIM_Cmd(TIM3, ENABLE); 
    	TIM_Cmd(TIM4, ENABLE);
    	TIM_Cmd(TIM5, ENABLE);
    	
    
    }
    
    
    
    
    展开全文
  • PWM控制舵机

    2019-08-25 21:31:05
    舵机控制一般需要一个20Ms左右的时基脉冲,该脉冲的高电平部分一般为0.5Ms~2.5Ms范围内的角度控制脉冲部分,总间隔为2Ms。以180°舵机为例,对应的控制关系如下: 0.5Ms————0° 1.0Ms————45° 1.5Ms——...

    舵机的控制一般需要一个20Ms左右的时基脉冲,该脉冲的高电平部分一般为0.5Ms~2.5Ms范围内的角度控制脉冲部分,总间隔为2Ms。以180°舵机为例,对应的控制关系如下:
    0.5Ms————0°
    1.0Ms————45°
    1.5Ms————90°
    2.0Ms————135°
    2.5Ms————180°在这里插入图片描述

    360°舵机与其他普通舵机不同,它实际相当于无极变速的减速电机,可以控制速度和方向,但是没有0-360°角度控制的功能。控制方向和一般舵机的控制信号相同:
    0.5Ms————正向最大转速
    1.5Ms————速度为0
    2.5Ms————反向最大转速

    我们以ESP8266 WIFI模块为例,查看其datasheet:
    在这里插入图片描述
    在这里插入图片描述
    根据公式:占空比 = (duty * 45)/(period * 1000)
    计算出duty。

    代码设计:

    // 全局变量
    os_timer_t pwm_timer;
    
    uint32 io_info[][3] = {
    		{PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12,12},
    		//{PERIPHS_IO_MUX_MTDO_U,FUNC_GPIO15,15},
    		//{PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13,13},
    		//{PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4,4},
    		//{PERIPHS_IO_MUX_GPIO5_U,FUNC_GPIO5,5}
    };
    
    //控制舵机
    void pwm_callback(void)
    {
    	static unsigned int duty = 0;
    	
    	duty = duty+ 28000;
    	pwm_set_duty(duty,0);
    	pwm_start();
    	delay_ms(400);
    
    	//停止
    	duty = 33333;
    	pwm_set_duty(duty,0);
    	pwm_start();
    	delay_ms(450);
    
    	duty = 44444;
    	pwm_set_duty(duty,0);
    	pwm_start();
    	delay_ms(400);
    
    	//停止
    	duty = 33333;
    	pwm_set_duty(duty,0);
    	pwm_start();
    
    	os_timer_disarm(&pwm_timer);
    }
    
    // 定时器定时连接舵机
    void ICACHE_FLASH_ATTR OS_Timer_1_Init_pwm(u32 time_ms, u8 time_repetitive)
    {
    	os_timer_disarm(&pwm_timer);											// 关闭定时器
    	os_timer_setfn(&pwm_timer,(os_timer_func_t *)pwm_callback, NULL);		// 设置定时器
    	os_timer_arm(&pwm_timer, time_ms, time_repetitive);  					// 使能定时器
    }
    
    // 程序主入口
    void ICACHE_FLASH_ATTR user_init(void)
    {
    	//1. 初始化串口
    	uart_init(115200,115200);								// 初始化串口波特率
    	os_delay_us(10000);										// 等待串口稳定
    	
    	//7. 启动定时连接舵机
    	uint32 p_duty[1] = {0};
    	pwm_init(20000,p_duty,1,io_info);
    	OS_Timer_1_Init_pwm(100,0);
    }
    
    展开全文
  • 16路模块 PWM舵机驱动板 控制器 机器人 IIC接口
  • 无极-先锋 10路PWM舵机控制器 设计

    千次阅读 2015-12-18 20:46:10
    一:本文主要介绍无极-先锋 10路PWM舵机控制器软硬件设计方法 二:硬件设计  控制器采用STM32F030作为主控,使用串口用于和PC通信,一个用户按键可以完成舵机控制程序的运行与停止,LED可以显示运行状态,板载...
  • PROTEUS仿真PWM控制舵机

    2011-05-11 19:08:44
    PROTEUS仿真 20路PWM控制舵机 VB上位机串口控制 学习机器人,工业控制的朋友可不要错过
  • 注意的地方是openmv3 P7-9是pwm口, angle(参数),参数是绝对角度。 # Servo Control Example # # This example shows how to use your OpenMV Cam to control servos. import time from pyb import Servo s1 =...
  • stm32pwm控制舵机

    2018-09-30 15:20:37
    自己写的stm32单片机输出pwm控制舵机程序,亲测有用
  • stm32 pwm控制舵机转动

    2019-05-04 18:31:44
    使用pwm驱动舵机转动至不同角度 main.c: #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "pwm.h" int main(void) { u16 out_led0pwmval=1950; //u8 dir=1; u16 led0...
  • 最简单的pwm信号控制舵机

    万次阅读 多人点赞 2016-06-26 09:54:01
    控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到...
  • PWM控制舵机总结

    千次阅读 2019-09-02 23:26:28
    舵机(英文叫Servo):它由直流电机、减速齿轮组、传感器和控制电路组成的一套自动控制系统。通过发送信号,指定输出轴旋转角度。舵机一般而言都有最大旋转角度(比如180度。)与普通直流电机的区别主要在,直流电机...
  • pwm控制舵机改写.rar

    2020-06-28 20:58:59
    基于STM32f103系列的单片机开发的PWM脉冲波形,通过改变rcc比较值改变占空比,从而控制任意的舵机需要调制的角度和旋转速度
  • 最近买了块16路PWM舵机驱动板,测试后做个总结。 舵机原理网上资料很多就不详细介绍了,一般以9g舵机为例,一个20ms的周期内通过0.5ms到2.5ms的脉冲宽度控制舵机角度。 板子为16通道12bit PWM舵机驱动,用2个引脚...
  • 使用的是32F103定时器输出PWM波来控制舵机,通过 TIM_SetComparex(TIMx,X)函数控制占空比,要注意的是占空比最大就是50%,也就是说X的数值是40%占空比和60%占空比时输出的波形是相同的
  • 定时器产生PWM 控制舵机旋转。
  • Micropython之pwm控制舵机

    千次阅读 2019-05-03 19:58:26
    Micropython的定时器Timer 简单例子 from pyb import Pin, Timer p = Pin('X1') # X1 has TIM2, CH1 ...ch = tim.channel(1, Timer.PWM, pin=p) ch.pulse_width_percent(50) 虽然Micropython有四个引脚能直接...
  • STM32 PWM 控制舵机.zip

    2020-05-29 09:07:05
    STM32 PWM 控制舵机.zip
  • STC89c52单片机,利用定时器中断产生PWM信号,控制舵机,涉及到定时器,中断,PWM知识
  • 使用51单片机输出PWM控制舵机

    万次阅读 多人点赞 2014-11-08 19:36:19
    舵机、使用51单片机的定时器中断实现PWM
  • 采用STM32控制舵机的角度转动,485通讯,同时通过STM32ISP模拟EEPROM保存数据

空空如也

1 2 3 4 5 ... 20
收藏数 16,689
精华内容 6,675
关键字:

PWM