智能车制作

标题: S3010舵机PWM控制 [打印本页]

作者: somebodyes    时间: 2014-2-5 22:18
标题: S3010舵机PWM控制
S3010都说了是靠脉宽控制的。是不是说白了就是高低电平占一个周期内20毫秒的时间决定啊可以这么理解吗

http://www.znczz.com/thread-25017-1-1.html
[attach]55277[/attach]
那这个程序里为什么是占空比的值控制的而不是用定时器或延时什么的啊


作者: 以梦为马    时间: 2014-2-5 22:18
小么啊,你理解的是对的,但是不是定时器控制,也不是依靠延时,是本身具有的PWM功能,要更改的那个值就是寄存器的值。
作者: Jyoun    时间: 2014-2-5 22:40
定时器可行,但是有很大的局限,用不好会造成不稳定,不可靠。延时更不说了,一直占用cpu,还不精确,你多写写程序就知道多么不可行了。
作者: somebodyes    时间: 2014-2-6 09:28
以梦为马 发表于 2014-2-5 23:38
小么啊,你理解的是对的,但是不是定时器控制,也不是依靠延时,是本身具有的PWM功能,要更改的那个值就是寄 ...

恩恩,我就是这么问,确认一把自己理解的对不对,下面就是那怎么计算呢,多少占空比是1Ms多少占空比是1.5Ms多少又是2Ms...

作者: somebodyes    时间: 2014-2-6 12:31
以梦为马 发表于 2014-2-5 23:38
小么啊,你理解的是对的,但是不是定时器控制,也不是依靠延时,是本身具有的PWM功能,要更改的那个值就是寄 ...

但是电机一接电就抖,PWM频率设置50,100HZ全没用,就抖不转,貌似程序没起作用

#include "sys.h"
#include "delay.h"
#include "wdog.h"
#include "led.h"
#include "ftm.h"
#include "uart.h"

#define Mid_duty    760
#define Half_Right   910
#define Right         1060
#define Half_Left    610
#define Left          460

uint16_t i;

int main(void)
{
       
        FTM_InitTypeDef FTM_InitStruct;
       
        SystemClockSetup(ClockSource_EX50M,CoreClock_100M);//初始化系统时钟 使用外部50M晶振 PLL倍频到100M
        DelayInit();
        LED_Init();

//初始化FTM

        FTM_InitStruct.Frequency = 50;                               // 50HZ
        FTM_InitStruct.FTMxMAP = FTM0_CH2_PC3;             //FTM0_CH2 PC3引脚
        FTM_InitStruct.FTM_Mode = FTM_Mode_EdgeAligned; //边沿对齐模式
        FTM_InitStruct.InitalDuty = 0;                                  //初始化后产生40%的占空比
        FTM_Init(&FTM_InitStruct);

        LED1=!LED1;

        while(1)
        {
       
        FTM_PWM_ChangeDuty(FTM0_CH2_PC3,Mid_duty);                      //舵机处于之间值
        DelayMs(5000);
       
        FTM_PWM_ChangeDuty(FTM0_CH2_PC3,Half_Right);                     //开始右偏
        DelayMs(5000);

        FTM_PWM_ChangeDuty(FTM0_CH2_PC3,Right);
        DelayMs(5000);

        FTM_PWM_ChangeDuty(FTM0_CH2_PC3,Mid_duty);
        DelayMs(5000);
       
        FTM_PWM_ChangeDuty(FTM0_CH2_PC3,Half_Left);                       //开始左偏
        DelayMs(5000);

        FTM_PWM_ChangeDuty(FTM0_CH2_PC3,Left);
        DelayMs(5000);
        }
}

//UART断言失败检测

void assert_failed(uint8_t* file, uint32_t line)
{
       
        UART_printf("assert_failed:line:%d %s\r\n",line,file);                     
        while(1);
}



作者: ⊙Lin⊙    时间: 2014-2-6 14:58
建议还是用常用的参数。
作者: 以梦为马    时间: 2014-2-6 22:00
你中间值没有选好,给定的占空比超出了调节范围。
作者: wu2466536    时间: 2014-2-22 21:31
、。。。




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2