Board logo

标题: 用PWM精确控制步进电机 [打印本页]

作者: jonah008    时间: 2007-8-31 11:21     标题: 用PWM精确控制步进电机

小弟已经能够用PWM控制步进电机,但是想精确的控制步进电机正转设定的角度和反转设定的角度,即:想用PWM通道输出一定数量的脉冲,改用什么方法来控制数量呢??
先谢谢了!
作者: jonah008    时间: 2007-8-31 11:22

俺用的是dg128!
作者: xphyym    时间: 2007-8-31 15:18

为什么步进电机还要用PWM控制?
直接用IO控制不就可以了
角度就更好控制了,看你的最小精度是多少就可以控制到多少了!
作者: jonah008    时间: 2007-9-1 09:12

用普通的IO口控制就占有了CPU的资源, 想选用PWM专用通道来减小CPU开支,但是PWM一旦启动之后就会一直产生脉冲,怎样让它产生一定数量的脉冲呢??
作者: happysuxin    时间: 2007-9-2 00:39

你要是非要这样就接回到计数器上数一下
作者: strongchen    时间: 2007-9-3 10:13

可以计PWM中断的个数,然后关断PWM输出。
作者: fjczd    时间: 2008-12-3 17:22

版主能详细说一下吗?我的程序如下,好像没用到中断啊?

#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#include "PLL.h"
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

void PWM_Init(void);

void main(void) {
unsigned int i;
unsigned long j=10000;
/* put your own code here */
DisableInterrupts;
PLL_Init();
Start_PLL();
PWM_Init();
//PWME=0xff; //运行PWM所有通道输出
PWMDTY5=50; //占空比为30%
PWME=0X0; //使能PWM
PWME=0X20;
for (i=0;i<10;i++)
{
PWME=0X20; //使能PWM //PWMCNT5
}
//for(i=0;i<0x64;i++)
//{
////while (j--);
////j=1000;
////while(j--);
////j=10000;
//PWMDTY5=i; //PWMDTYx:PWM占空比寄存器 设置占空比
//PWME=0X20; //使能PWM
//} /* wait forever */
/* please make sure that you never leave this function */
}

// 使用PWM5进行控制
void PWM_Init(void)
{
PWME=0x00; //Close PWM
PWMPOL =0X20; //PWMPOL;PWM极性寄存器 0X20 先输出高电平,占空比计数器计数完毕后变为低电平
PWMCLK =0X20; // PWMCLK:PWM时钟选择寄存器 0X20使用SA时钟
PWMPRCLK=0X07; //PWMPRCLK:PWM预分频时钟选择寄存器 时钟A为总线128分频
PWMCAE=0X00; //PWMCAE:PWM剧中对齐允许寄存器 左对齐输出模式
PWMCTL=0X00; //PWMCTL:PWM控制寄存器 非级联方式 单独使用通道5
PWMSCLA=0X05; //PWMSCLA:PWM比例因子寄存器A CLOCKSA=CLOCKA/(2*PWMSCLA)为3kHz
PWMPER5=0x64; // PWMPERx:PWM通道周期寄存器 设定周期


//PWMSCLA = 60;
//PWMPRCLK_PCKB=3; // Clock B= Bus Clock/8
//PWMCTL |=PWMCTL_CON23_MASK;
// PWMPER0 = 100; //0.5ms
// PWMPER1 = 100;
// PWMDTY0=25;
// PWMDTY1=30;
// PWMPER23=60000;
// PWMDTY23=4500;

}


作者: fjczd    时间: 2008-12-4 08:57

QUOTE:
以下是引用jonah008在2007-8-31 11:21:00的发言:
小弟已经能够用PWM控制步进电机,但是想精确的控制步进电机正转设定的角度和反转设定的角度,即:想用PWM通道输出一定数量的脉冲,改用什么方法来控制数量呢??
先谢谢了!

问题解决了吗?我现在也遇到这样的问题了。希望能指点一下


作者: fjczd    时间: 2008-12-4 08:57

QUOTE:
以下是引用jonah008在2007-8-31 11:21:00的发言:
小弟已经能够用PWM控制步进电机,但是想精确的控制步进电机正转设定的角度和反转设定的角度,即:想用PWM通道输出一定数量的脉冲,改用什么方法来控制数量呢??
先谢谢了!

QUOTE:
以下是引用strongchen在2007-9-3 10:13:00的发言:
可以计PWM中断的个数,然后关断PWM输出。

能详细说说吗?还是不太明白


作者: strongchen    时间: 2008-12-4 10:27

如果一定要精确到一个脉冲数的精度,那只能用定时器的PWM功能了。如果精度要求没那么高,可以同时用定时器来定时,以确定PWM输出的时间。
作者: fjczd    时间: 2008-12-4 13:46

因为是控制步进电机的,所以要求能精确输出脉冲的个数。现在板子已经做好了,就是用PWM的管脚来控制步进电机的。

我现在用pwm的中断,不能进去啊。程序如下。帮忙看啊可能是哪里的问题呢

//PWM紧急关断
interrupt void interrupt_PWM(void)
{
PWME=0X0;
}


作者: fjczd    时间: 2008-12-4 13:48

另外,如果PWM功能不行的话,那用普通管脚,自己编程输出高低电平行不行,这样的话,脉冲个数肯定是可以准确控制的。步进电机似乎对高电平的时间要求不是很高,只要维持一段时间就可以了
作者: 317772899    时间: 2008-12-4 14:09

输出PWM的口与PT口连起来,计数脉冲个数 我是这样实现的


作者: fjczd    时间: 2008-12-4 14:22

strongchen

我把文件发到你信箱了


作者: fjczd    时间: 2008-12-4 14:58

QUOTE:
以下是引用fjczd在2008-12-4 13:48:00的发言:
另外,如果PWM功能不行的话,那用普通管脚,自己编程输出高低电平行不行,这样的话,脉冲个数肯定是可以准确控制的。步进电机似乎对高电平的时间要求不是很高,只要维持一段时间就可以了

QUOTE:
以下是引用317772899在2008-12-4 14:09:00的发言:

输出PWM的口与PT口连起来,计数脉冲个数 我是这样实现的

多谢,那么用PWM的中断来判断行么?

我看有人这么推荐过,包括咱们版主好像都这么说过,但是我尝试用中断,总是不成功啊。


作者: fjczd    时间: 2008-12-5 09:10

哪位能详细说说呢?谢谢了


作者: strongchen    时间: 2008-12-5 09:40

PWM中断是用来检测PWM7IN口输入信号的,用于快速关断PWM输出,不适合用于PWM输出脉冲的计数。
作者: fjczd    时间: 2008-12-8 12:02

多谢




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0