打印

用单片机如何实现不同的频率控制3个步进电机同时转动?

[复制链接]
楼主: ctstt
手机看帖
扫描二维码
随时随地手机跟帖
21
ctstt|  楼主 | 2011-4-15 20:00 | 只看该作者 回帖奖励 |倒序浏览
15# joyme
占空比不用变 ,就是要频率变化而已!

使用特权

评论回复
22
ctstt|  楼主 | 2011-4-15 20:23 | 只看该作者
17# coody
恩PCA 4路的可以考虑一下,现在买的单片机只有2路,DDS不是很懂!谢谢你们给的参考,小弟在这里感激不尽!:victory:

使用特权

评论回复
23
ctstt|  楼主 | 2011-4-15 20:24 | 只看该作者
18# heykay 什么型号?可以参考一下!

使用特权

评论回复
24
ctstt|  楼主 | 2011-4-15 20:26 | 只看该作者
19# sxhhhjicbb
FPGA现在还不会啊,有学这个的准备了,现在能写的就C51 avr了

使用特权

评论回复
25
ctstt|  楼主 | 2011-4-15 20:33 | 只看该作者
20# icecut
根据STC的资料 8位PWM只是改变占空比不能改变频率,要想改变频率的话 ,同样要用到定时器T0,或者P3.4引脚吧!

使用特权

评论回复
26
1314wankai| | 2011-4-15 22:17 | 只看该作者
AVR 90S8535 利用TIMER1 有两通道PWM输出,再利用TIMER1的溢出中断输出一个PWM,就可以实现一个定时器输出三个PWM了

PIC部分单片机(pic18fxx,pic16f88x)也有CCP(compare,catch,pwm),利用上述同样原理同样可以

使用特权

评论回复
27
木字四点水| | 2011-4-15 23:11 | 只看该作者
100K有点快啊,呵呵

使用特权

评论回复
28
古道热肠| | 2011-4-15 23:21 | 只看该作者
新的ARM和DSP大都有独立的PWM脉冲生成模块,第通道的频率和占空比可调,且纯硬件生成PWM波,比较适合于这种应用,软件或用定时器模拟PWM,频率太高时会比较难实现的。

使用特权

评论回复
29
古道热肠| | 2011-4-15 23:25 | 只看该作者
送一段在LPC2148上定时器模拟的PWM波的相关代码,由于ARM运行速度快,对主程序影响较小,可实现两路模拟PWM输出和音乐方波输出
//#define SIM_PWM5 1<<21                 //P0.21
//#define SIM_PWM6 1<<9                //P0.9
#define SIM_PWM5 1<<18                 //P0.18
#define SIM_PWM6 1<<19                //P0.19


uint uiPWM5_RatioSetValue;
uint uiPWM6_RatioSetValue;

uint uiPWMPlusLength;
#define SIM_PWM_Plus_MaxLength 1200  //控制波形的周期
uint uiSIM_PWM5_Temp;
uint uiSIM_PWM6_Temp;
void SIM_PWM_PLUS_CTRL(void)
{
        if(uiPWMPlusLength)
        {
                 uiPWMPlusLength--;
        }
        else
        {
                uiPWMPlusLength = SIM_PWM_Plus_MaxLength;
//                ucSIM_PWM_Temp = 98;                 //占空比控制值
//                ucSIM_PWM_Temp = 70;                 //占空比控制值
                uiSIM_PWM5_Temp = uiPWM5_RatioSetValue;
                uiSIM_PWM6_Temp = uiPWM6_RatioSetValue;

        //         LightContol(2,1);

                IO0SET = SIM_PWM5;
                IO0SET = SIM_PWM6;

        }

        if(uiSIM_PWM5_Temp)
        {
                uiSIM_PWM5_Temp--;
        }
        else
        {
//                LightContol(2,0);
                IO0CLR = SIM_PWM5;
//                IO0CLR = SIM_PWM6;

        }

        if(uiSIM_PWM6_Temp)
        {
                uiSIM_PWM6_Temp--;
        }
        else
        {
//                LightContol(2,0);
                IO0CLR = SIM_PWM6;
        }
}

bool bEnableMusicOutFlag;
uint uiDivValue;        //分频值
uint uiMusicFrequencyCount;                //生成指定音乐频率的计数终值

void SetMusicOn(void)
{
        IO0DIR |=  Beep_Pin;

        bEnableMusicOutFlag = 0xff;
        uiDivValue = 0;
}

void SetMusicOff(void)
{
        bEnableMusicOutFlag = false;
        IO0SET = Beep_Pin;
}

//定时器1的中断频率是120K Hz
//音乐波控制函数调用
void SIM_Music_Plus_CTRL(void)
{
        if(bEnableMusicOutFlag)
        {
                uiDivValue++;

                if(uiDivValue == (uiMusicFrequencyCount/2))
                {
                        IO0CLR = Beep_Pin;
                }
               
                if(uiDivValue == uiMusicFrequencyCount)
                {
                        IO0SET = Beep_Pin;
                        uiDivValue = 0;
                }
        }
}

uchar  ucFlag;
void  IRQ_Timer1(void) __irq
{
         if(ucFlag)
         {
                 ucFlag =0;
         }
         else
         {
                 ucFlag =1;
         }

/*
         if(ucFlag)
         {
                LightContol(1,1);
         }
         else
         {
                 LightContol(1,0);
         }
         */
         //频率固定,占空比可调的软件PWM波生成函数调用。
          SIM_PWM_PLUS_CTRL();
         //占空比固定,频率可调的,音乐波控制函数调用
         SIM_Music_Plus_CTRL();

         T1IR = 0x01;
         VICVectAddr = 0x00;
}

  //初始化系统中断
void Init_SystemInterrupt(void)
{
        /* 设置定时器0中断IRQ */
        VICIntSelect = 0x00;                                /* 所有中断通道设置为IRQ中断                        */
        VICVectCntl0 = 0x20 | 0x05;                        /* 设置定时器1中断通道分配最高优先级        */
        VICVectAddr0 = (unsigned int)IRQ_Timer1;        /* 设置中断服务程序地址                                        */
        VICIntEnable = 1 << 0x05;                        /* 使能定时器1中断                                                */

}

使用特权

评论回复
30
ctstt|  楼主 | 2011-4-16 00:05 | 只看该作者
26# 1314wankai :handshake 太感谢你们了

使用特权

评论回复
31
ctstt|  楼主 | 2011-4-16 00:07 | 只看该作者
27# 木字四点水
呵呵,对于单片机来说确实有点快,所以处理起来有点麻烦!

使用特权

评论回复
32
ctstt|  楼主 | 2011-4-16 00:20 | 只看该作者
29# 古道热肠 :handshake 太感谢你了,现在单片机满足不了我的工作需求,正准备学ARM,ARM那个芯片型号功能比较全面,资料比较多的给我推荐一下吧,以后多多指教!:handshake

使用特权

评论回复
33
jqlilee| | 2011-4-16 23:10 | 只看该作者
你为啥子要开中断呢?不中断就不能出PWM吗?

使用特权

评论回复
34
古道热肠| | 2011-4-17 17:25 | 只看该作者
32# ctstt
学习CM3内核的ARM芯片吧,未来单片机的主流品种。ST,TI和NXP都有对应的MCU,随便找个学都会发现功能太强大了。

使用特权

评论回复
35
ctstt|  楼主 | 2011-4-18 20:57 | 只看该作者
33# jqlilee
不开中断的话,那还有其他的任务要执行啊,这样输出的脉冲时很不稳定的,这样电机运动会卡,或者发出很大的噪音!

使用特权

评论回复
36
MyLovetus| | 2011-4-19 16:32 | 只看该作者
马达速度才是设计的关键。速度比较高的话,这还真是个问题。
当然,马达速度最快能到多高,这也是一个问题。
速度跑得很高,马达能不能干好活(有没有足够力矩输出),这又是一个问题。
如果你找到了我,当然这些都不是问题。

使用特权

评论回复
37
ctstt|  楼主 | 2011-4-24 15:15 | 只看该作者
34# 古道热肠
查了一下,准备买个ST的回来玩玩!

使用特权

评论回复
38
ctstt|  楼主 | 2011-4-24 15:15 | 只看该作者
36# MyLovetus
那请你多多指教了!小弟在此感激不尽!

使用特权

评论回复
39
ctstt|  楼主 | 2011-4-24 16:10 | 只看该作者
12# joyme

if(countbase  == (PWM1Width * PWM2Width *PWM3Width ))
         countbase  = 0;
控制电机的脉冲是不断变化的,有可能增加,有可能减少,实际发现这个清零的情况不能确定啊?有其他解决的方法吗?

使用特权

评论回复
40
ctstt|  楼主 | 2011-4-29 23:19 | 只看该作者
谢谢各位大虾的关注,现在用PCA模块把问题解决了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则