搜索
bottom↓
回复: 44

L298驱动两路直流电动机(MEGA16的PWM调速)

[复制链接]

出0入0汤圆

发表于 2007-8-25 22:27:28 | 显示全部楼层 |阅读模式
这是我写的MEGA16和L298 驱动两路电机的程序,有电路,做机电控制的可以看看,

可以PWM 调速

点击此处下载armok01168221.rar
头像被屏蔽

出0入0汤圆

发表于 2007-8-26 10:25:21 | 显示全部楼层
谢谢共享!



COOL!

出0入0汤圆

发表于 2007-8-26 10:44:53 | 显示全部楼层
好东西,收藏了,谢谢!

出0入0汤圆

发表于 2007-8-26 16:41:13 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2007-8-27 09:57:58 | 显示全部楼层
好!谢了.

出0入0汤圆

 楼主| 发表于 2007-8-27 11:45:39 | 显示全部楼层
战长还是那两行" 谢谢共享,COOL“

谢谢鼓励,以后我有东西就传上来。

出0入0汤圆

发表于 2007-8-27 20:20:51 | 显示全部楼层
正在调试,谢谢共享参考

出0入0汤圆

发表于 2007-8-27 20:22:48 | 显示全部楼层
大哥~不行啊   有错误~

看来自己没有运行过吧?

出0入0汤圆

发表于 2007-8-28 08:11:55 | 显示全部楼层
#include"iom16v.h"

#include"pwm.c"



但是目录里面只有一个 pwm.h ,要改成pwm.h的内容复制过来吧

出0入0汤圆

发表于 2007-8-28 08:13:02 | 显示全部楼层
图是wps的,能不能转成jpg的图片啊,谢谢

出0入0汤圆

发表于 2007-8-28 10:27:34 | 显示全部楼层
不对吧,没有PWM.C文件,只有PWM.H文件

出0入0汤圆

发表于 2007-8-29 11:17:12 | 显示全部楼层
不错!顶一下,正在找相关资料呢!

出0入0汤圆

发表于 2007-8-29 11:49:50 | 显示全部楼层
// ***********************************************************

//软件功能描述:

//本程序的作用是输出六路三组互补对称的pwm波形,

//其中任一组波形的死区时间通过软件设定。

//在本程序中的单个pwm周期为固定的100ms

//死区时间假设为4ms

//***********************************************************



//*************************************************************

//硬件描述:

//目标mcu:                        ATMEGA64

//使用外部晶振:        14.7456MHZ

//*************************************************************





#include <avr\io.h>              

#include <avr\interrupt.h>      

#include <avr\signal.h>   

#define PWM_CIRCLE    4          //PWM周期为40mS,(单位为10mS ) 注意:PWM_CIRCLE的取值范围应满足条件1152*PWM_CIRCLE<=65536

#define DEAD_TIME        1                //定义死区时间为1mS,(单位为1mS)

#define TOP 17                                               



char i;                                                //定义全局变量i用以调用数组

char flag1,flag2;                        //全局标志位变量flag2用于在主程序中判断是否该输出另外半个周期,

                                //而flag1则是用来标记i是否计数到TOP(17)



long y=1152;

//任意的测试数组       

const char U[]={

5,10,15,20,25,30,35,40,45,45,40,35,30,25,20,15,10,5

};

const char V[]={

5,10,15,20,25,30,35,40,45,45,40,35,30,25,20,15,10,5

};

const char W[]={

5,10,15,20,25,30,35,40,45,45,40,35,30,25,20,15,10,5

};



//***********************************************************

//中断处理程序,采用定时器1的溢出中断,在相位与频率修正PWM模式下,溢出时刻发生在BOTTOM处

//***********************************************************

SIGNAL(SIG_OVERFLOW1)

{

        //前一个式子用来确定比较匹配的时间点,后一个式子用来增加死区时间。

        //因为OCR1A用来控制上桥臂的导通时间,由于存在死区时间,因此导通时

        //间须少于实际的IPM桥臂导通时间,所以要将比较匹配时间往后推移。

        OCR1A=y*PWM_CIRCLE*U/100 + 115*DEAD_TIME/2;

                OCR3A=y*PWM_CIRCLE*U/100 - 115*DEAD_TIME/2;

       

        OCR1B=y*PWM_CIRCLE*V/100 + 115*DEAD_TIME/2;       

                OCR3B=y*PWM_CIRCLE*V/100 - 115*DEAD_TIME/2;       

               

        OCR1C=y*PWM_CIRCLE*W/100 + 115*DEAD_TIME/2;

                OCR3C=y*PWM_CIRCLE*W/100 - 115*DEAD_TIME/2;

                if(i==TOP)

                        {i=0;flag1=1;flag2=!flag2;}

                        else

                        i++;       

}



// ***********************************************************

// Main program

// ***********************************************************



void init(void)

{

        //升序记数时比较匹配将置位OC1A/OC1B/OC1C,降序记数时比较匹配将清零OC1A/OC1B/OC1C

        TCCR1A=(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(1<<COM1C1)|(1<<COM1C0)|(0<<WGM11)|(0<<WGM10);       

       

        //升序记数时比较匹配将清零OC3A/OC3B/OC3C ,降序记数时比较匹配将置位OC3A/OC3B/OC3C

        TCCR3A=(1<<COM3A1)|(0<<COM3A0)|(1<<COM3B1)|(0<<COM3B0)|(1<<COM3C1)|(0<<COM3C0)|(0<<WGM31)|(0<<WGM30);

       

        //相位与频率修正PWM TOP值为ICR1,OCR1x更新时刻BOTTOM,64分频

        TCCR1B|=(1<<WGM13)|(0<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10);

       

        //相位与频率修正PWM TOP值为ICR3,OCR3x更新时刻BOTTOM,64分频

        TCCR3B|=(1<<WGM33)|(0<<WGM32)|(0<<CS32)|(1<<CS31)|(1<<CS30);

       



       

    i        =        0;                                                                               

        flag1=        0;                                                                                //标志位开始置0

        flag2=        0;                                       

       

        OCR1A=1152*PWM_CIRCLE;

                OCR3A=0;

       

        OCR1B=1152*PWM_CIRCLE;       

                OCR3B=0;       

               

        OCR1C=1152*PWM_CIRCLE;

                OCR3C=0;

       



               

        ICR1=1152*PWM_CIRCLE;                                                        //定义计数器1的TOP值,由于是双斜坡方式,所以周期会增大一倍

        ICR3=1152*PWM_CIRCLE;                                                        //定义计数器3的TOP值

       

        DDRB|=(1<<DDB5)|(1<<DDB6)|(1<<DDB7);               //设置D口的5,6,7脚为输出,即OCR1A,OCR1B,OCR1C

        DDRE|=(1<<DDE3)|(1<<DDE4)|(1<<DDE5);                        //设置E口的3,4,5脚为输出,即OCR3A,OCR3B,OCR3C

        TIMSK|=(1<<TOIE1);                                                            //T/C1 溢出中断使能

        sei();                                                                                        //开中断

}

int main(void) {



  init() ;

  while(1)

  {

        while(flag1==1)

        {       

        if(flag2==1)

                {

                //停止时钟源以便修改波形输出方式

                TCCR1B|=(1<<WGM13)|(0<<WGM12)|(0<<CS12)|(0<<CS11)|(0<<CS10);

                TCCR3B|=(1<<WGM33)|(0<<WGM32)|(0<<CS32)|(0<<CS31)|(0<<CS30);

               

                TCCR1A=(1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(1<<COM1C1)|(0<<COM1C0)|(0<<WGM11)|(0<<WGM10);       

                TCCR3A=(1<<COM3A1)|(1<<COM3A0)|(1<<COM3B1)|(1<<COM3B0)|(1<<COM3C1)|(1<<COM3C0)|(1<<WGM31)|(0<<WGM30);

               

                //重新启动时钟源,开始继续计数

                TCCR1B|=(1<<WGM13)|(0<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10);

                TCCR3B|=(1<<WGM33)|(0<<WGM32)|(0<<CS32)|(1<<CS31)|(1<<CS30);

                }

        else

                {

                //停止时钟源以便修改波形输出方式

                TCCR1B|=(1<<WGM13)|(0<<WGM12)|(0<<CS12)|(0<<CS11)|(0<<CS10);

                TCCR3B|=(1<<WGM33)|(0<<WGM32)|(0<<CS32)|(0<<CS31)|(0<<CS30);

               

                TCCR1A=(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(1<<COM1C1)|(1<<COM1C0)|(0<<WGM11)|(0<<WGM10);       

                TCCR3A=(1<<COM3A1)|(0<<COM3A0)|(1<<COM3B1)|(0<<COM3B0)|(1<<COM3C1)|(0<<COM3C0)|(1<<WGM31)|(0<<WGM30);

               

                //重新启动时钟源,开始继续计数

                TCCR1B|=(1<<WGM13)|(0<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10);

                TCCR3B|=(1<<WGM33)|(0<<WGM32)|(0<<CS32)|(1<<CS31)|(1<<CS30);

                }

        flag1 = 0;

        }

  }



  return 0;

}

出0入0汤圆

发表于 2007-8-29 17:22:32 | 显示全部楼层
Amork 这样的帖子也是COOL? 那么这个呢?



http://www2.ouravr.com/bbs/bbs_content.jsp?bbs_sn=716814&bbs_page_no=1&bbs_id=1000

出0入0汤圆

发表于 2008-7-21 16:23:07 | 显示全部楼层
怎么运行有错误呢,很奇怪!!

出0入0汤圆

发表于 2009-6-11 11:34:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-11 21:44:22 | 显示全部楼层
谢谢楼主共享

出0入0汤圆

发表于 2009-6-13 08:28:07 | 显示全部楼层
3Q分享!

出0入0汤圆

发表于 2009-6-25 11:34:40 | 显示全部楼层
还是谢谢啊,正在找资料学呢。

出0入0汤圆

发表于 2009-6-25 14:13:36 | 显示全部楼层
学习学习

出0入10汤圆

发表于 2009-6-25 16:42:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-25 17:34:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-7-31 10:27:51 | 显示全部楼层
thanks

出0入0汤圆

发表于 2009-7-31 13:32:13 | 显示全部楼层
的确不怎嘛

出0入0汤圆

发表于 2009-8-3 10:51:26 | 显示全部楼层
很一般

出0入0汤圆

发表于 2009-8-3 16:39:13 | 显示全部楼层
L298的输出电流太小了.

出0入0汤圆

发表于 2009-8-3 17:14:39 | 显示全部楼层
飘过

出0入0汤圆

发表于 2009-8-3 18:12:47 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-8-17 20:39:16 | 显示全部楼层
晕谁能把它转jpg上传上来 谢谢!

出0入0汤圆

发表于 2009-8-17 21:33:10 | 显示全部楼层
谢谢分享 正在找相关的东西呢

出0入0汤圆

发表于 2009-9-3 11:51:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-8 22:50:19 | 显示全部楼层
感谢 楼主 好人

出0入0汤圆

发表于 2011-1-7 21:08:32 | 显示全部楼层
谢谢 共享!!

出0入0汤圆

发表于 2011-3-25 01:15:21 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-5-27 12:30:36 | 显示全部楼层
这个都酷了。。。。

出0入0汤圆

发表于 2011-5-27 21:38:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-1 22:37:30 | 显示全部楼层
这个肯定用得到,MARK

出0入0汤圆

发表于 2012-2-2 09:39:13 | 显示全部楼层
好东西,收藏了,正在找。谢谢!

出0入0汤圆

发表于 2012-7-15 17:28:52 | 显示全部楼层
谢谢共享,正在使用298

出0入0汤圆

发表于 2012-7-15 20:21:41 | 显示全部楼层
谢谢正有打算用16做个小车

出0入0汤圆

发表于 2012-7-19 13:01:34 | 显示全部楼层
不错 易理解

出0入0汤圆

发表于 2012-7-19 13:44:13 | 显示全部楼层
谢谢,学习学习

出0入0汤圆

发表于 2012-7-19 16:46:13 | 显示全部楼层
学习学习,谢谢

出0入0汤圆

发表于 2012-7-22 11:21:40 | 显示全部楼层
为什么有人询问,没人回答!纳闷。。。

出0入0汤圆

发表于 2012-7-27 16:42:59 | 显示全部楼层
mark一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 04:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表