直流有刷伺服控制系统(pic单片机,pid控制)

2019-11-11来源: 51hei关键字:直流有刷  伺服控制系统  pic单片机  pid控制

基于PIC18系列单片机的直流有刷伺控制系统:(来处于国外贴)
1:原理图(PDF)
2:原理图及PCB图(EAGLE)
3:带pid + 编码器的控制程序。main.c


电路原理图如下:

 

单片机源程序如下:

// Vertical motor driver code 

// Oringially made by Kevin Wolfe 2009-2011

// Modified by Matt Moses 2010-2011

// 


#include

//#include

//#include

//#include



#define counterToSpeedScalar 150

#define numCountsPerStep 1

#define maxSpeed 255

#define Kp 35.0

#define Kd 0.0

#define Ki 0.0

#define dt 0.01

#define speedStep 1

#define errorTol 1

#define tempADSpeed 255

#define stepHomeThreshold 500

#define upTorqueLimit 150

#define downTorqueLimit -120


#pragma config IESO = ON

#pragma config FSCM = ON

#pragma config OSC = INTIO2        

#pragma config PWRT = OFF

#pragma config BOR = OFF

#pragma config WDT = OFF

#pragma config MCLRE = OFF


/****** DISABLE LVP (LOW-VOLTAGE Programming) ******/

/* This allows RB5 to operate as an interuppt on change I/O pin */

#pragma config LVP = OFF

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


void low_isr (void);

void high_isr (void);

void set_motor_output (unsigned char desiredPWM, unsigned char desiredDirection);


#pragma code high_vector_section=0x8

void high_vector (void)

{

_asm GOTO high_isr _endasm

}

#pragma code


#pragma code low_vector_section=0x18

void low_vector (void)

{

_asm GOTO low_isr _endasm

}

#pragma code


volatile int stepHighCounter = 0;


volatile char stepPulses = 0;

//volatile int stepCounts;

volatile int currentCounter = 0;

//volatile unsigned char currentADvalue;

volatile unsigned char trigger = 0;

//volatile structPrevStates prevStates;

//volatile enum { DIR_CW = 0, DIR_CCW = 1 } direction;

volatile enum { LOW = 0, HIGH = 1} prevA = LOW;


// changeToggle is a varb used for debugging

volatile enum {LOW = 0, HIGH = 1} changeToggle;


#pragma interrupt high_isr

void high_isr(void)

{

        if ( INTCONbits.INT0IF ) //step pulse flag 

        {


                // reset stepTimerFoo

                stepHighCounter = 1;


                // do important stuff

                if ( PORTBbits.RB1 )    //Check direction pin

                {

                        stepPulses++;

                }

                else

                {

                        stepPulses--;

                }

        

                INTCONbits.INT0IF = 0; //reset step flag

        }


        if ( INTCONbits.RBIF ) //PORTB change interrupt

        {


//                // This is a little block for debugging - toggles A every time a change on PORTB

//        

//                if (changeToggle) {

//                        changeToggle = 0;

//                        PORTAbits.RA1 = 0;

//                }

//                else {

//                        changeToggle = 1;

//                        PORTAbits.RA1 = 1;

//                } 


                if ( PORTBbits.RB5^prevA )          //CW Rotation

                {

                        currentCounter++;

                        //PORTAbits.RA1 = 0;

                }

                else                                                //CCW Rotation

                {

                        currentCounter--;

                        //PORTAbits.RA1 = 1;

//                        if (changeToggle) {

//                                changeToggle = 0;

//                                PORTAbits.RA1 = 0;

//                        }

//                        else {

//                                changeToggle = 1;

//                                PORTAbits.RA1 = 1;

//                        } 

                }



                prevA = PORTBbits.RB4;

                PORTAbits.RA1 = PORTBbits.RB5;


                INTCONbits.RBIF = 0; //resetQuadFlag

        }

}


#pragma interruptlow low_isr

void low_isr(void)  //timer interupt

{

        trigger = 1;

        INTCONbits.TMR0IF = 0;                         // reset TMR0 interrupt flag

}



void set_motor_output(unsigned char desiredPWM, unsigned char desiredDirection)

{

        if ( desiredDirection )

        {

                PORTBbits.RB2 = 0;

                CCPR1L = desiredPWM;                          // This is the register for the 8 MSB of the PWM pin RB3.

        }

        else

        {

                PORTBbits.RB2 = 1;

                CCPR1L = (desiredPWM );          // This is the register for the 8 MSB of the PWM pin RB3.

        }

}


long abs(long i) 

        if (i < 0) 

                return -i; 

        else 

                return i; 


char sgn(long i)

{

        if (i < 0)

                return -1;

        else if (i > 0)

                return 1;

        else

                return 0;

}



void main (void)

{

        long prevCounter = 0;

        unsigned char tempTrigger = 0; 

        char tempStepPulses = 0;

        long tempCurrentCounter = 0;

        

        unsigned char currentADvalue = tempADSpeed;

        long desiredCounter = 0;

        long error = 0;

        long prevError = 0;


        long velocity = 0;


        float integral = 0.0;

        float derivative = 0.0;


        long output = 0;


        char testState = 0;

        long testCounter = 0;




        char homeFlag = 0;

    enum { LOW = 0, HIGH = 1} homeDir = LOW;


        /*************** SETUP INTERRUPTS ******************/

        INTCONbits.GIEH = 0;                 // Temporarily disable global interrupts

        INTCONbits.GIEL = 0;                 // Temporarily disable peripheral interrupts

        INTCONbits.TMR0IE = 1;                 // Enable TMR0 Overflow interrupt

        INTCONbits.INT0IE = 1;                 // Enable external interrupt on INT0/RB0

        INTCONbits.RBIE = 1;                 // Enable Port B change interrupt


        //INTCON2bits.RBPU = 0;                 // Enable Port B pull-ups

        INTCON2bits.RBPU = 1;                 // Disable Port B pull-ups

        INTCON2bits.INTEDG0 = 1;         // Interrupt on rising edge for INT0

INTCON2bits.TMR0IP = 0; // Set TMR0

[1] [2] [3] [4] [5]
关键字:直流有刷  伺服控制系统  pic单片机  pid控制 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479593.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:dsPIC30F6015控制AD7715程序源码 亲测可用
下一篇:PIC18读取SD卡示例PIC18 SD BMP Reader源码

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

Qorvo推出新型电源应用控制器,适用于无刷直流电动工具
移动应用、基础设施与国防应用中核心技术与RF解决方案的领先供应商Qorvo®, Inc.(纳斯达克代码:QRVO)今日宣布,推出市场上性能最强大的新型电源应用控制器(PAC)系列PAC5xxx。该系列的单芯片SOC控制器可实现高效率、高性能和较长的电池寿命,适用于无刷直流(BLDC)电机供电工具。   Qorvo可编程电源管理业务部门总经理Larry Blackledge表示:“Qorvo 率先推出在一块芯片上集成高性能FLASH MCU的集成式可控制、可编程的智能栅极驱动器解决方案。通过PAC5527,OEM能够设计高度可靠的高性能工具,且占用空间极小。” Qorvo的新型PAC5527
发表于 2019-11-05
Qorvo推出新型电源应用控制器,适用于无刷直流电动工具
STSPIN强势出击,设计、应用、技术、生产一个都不能少
、保护器件产品部市场和应用总监David Lucchetti2017年4月17日,ST在北京召开了STSPIN电机驱动产品媒体交流会。意法半导体亚太区智能电源、IPAD、保护器件产品部市场和应用总监David Lucchetti给媒体朋友讲述了ST如何顺应市场发展趋势,勇于求变开发设计高集成度、高能效、高成本效益的创新解决方案。“从固件、硬件、MCU、运动控制,我们拥有完整的解决方案。”David Lucchetti介绍说,ST有超过125种直流有刷电机、直流无刷电机和步进电机的产品型号;从1.8V 到 80V的可延展的方案;从超微型QFN到业界优秀的功率封装可选。“高集成度、封装小、低功耗是ST电机驱动产品应对工业苛刻复杂的自动化环境
发表于 2017-04-25
STSPIN强势出击,设计、应用、技术、生产一个都不能少
直流电动机电刷调整的应用分析
1 前言 直流电动机是将直流电能转换成机械能的旋转电动机。作为电力拖动使用的直流电动机,由于它具有良好的启动与调速性能,在某些要求启动转矩大,或对调速性能要求较高的设备中都采用直流电动机。直流电动机是由定子和转子两部分组成。定子主要由主磁极、换向极、机座和电刷装置等组成。转子主要由电枢铁芯、电枢绕组、换向器、转轴等组成。电刷靠弹簧压力压紧在换向器表面,将电枢绕组和外电路连接起来。换向器由许多彼此绝缘的换向片构成,片与片之间彼此绝缘。 某起动直流电动机的电刷采用各项指标与原型机电刷相似的常用航空航天电机用金属石墨电刷(TJ5A),长试中发现原电刷的高度,对于500(原300小时)小时维修一次的要求有些欠缺。因此,提出了对原电刷进行
发表于 2016-01-13
TI推出可调节电流驱动能力的刷式直流栅极驱动器
具有片上保护功能的高集成度、大电流栅极驱动器可使电路板占用空间缩小40%   日前,德州仪器(TI)宣布推出一款集成式栅极驱动器,该器件提供了可调节的栅极驱动设置,可在更为宽泛的范围内,灵活的驱动外部场效应晶体管(FET),从而支持多种电机,以及各种各样不同速度的负载。DRV8701可使设计人员能在白色家电、家用电器、机器人、家庭自动化、电动工具、工业泵和阀门等设备中采用单个栅极驱动器,从而在各种有刷DC电机模型中扩展自己的平台。   凭借其可调栅极驱动的能力、高级保护功能和其它集成组件,DRV8701有刷DC栅极驱动器使设计人员能用单个的器件取代多达45个分立组件,从而可以打造更小巧、更稳健的设计
发表于 2015-07-07
德州仪器推出低功耗低压直流有刷马达驱动DRV8837
近日,德州仪器推出了1.8A 低压直流有刷马达驱动方案DRV8837。这是一款低功耗高集成度的方案,根据TI提供的资料显示,该款产品相比外形缩小75%。此外,与现有器件相比,它还将 RDS(ON) 降低 50%,将睡眠电流降低75%。 DRV8837四大特点:双轨供电、集成度高、封装面积小、功耗低 该款产品使用双电压双轨供电,逻辑驱动部分为1.8V至7V,马达控制部分为1.8V至11V,支持PWM控制。     DRV8837内部功能图一览 TI中国市场推广经理李志林谈到双轨制的好处时表示,“逻辑驱动和马达驱动分开,可以确保马达驱动力更强,器件使用范围更宽;第二点则是防止开机瞬间的冲击电流
发表于 2012-08-27
基于ATmega16L微处理器的电液伺服控制系统设计
    针对电液伺服闭环控制过程中,设定信号不断发生变化,电液阀门位置定位精确度较低的难题。采用ATmega16L作为核心控制器,并配有高精度A/D、D/A转换器,通过对阀门开度控制信号和位置反馈信号进行采集、转换、计算和比较,发出控制信号决定并执行换向阀的换向、交流伺服电动机的起停运转,推动液压缸推杆的伸缩,进而对阀门转角大小、开度百分比进行精确定位。    随着电力电子技术、电机控制技术、计算机技术和传感器技术的发展,交流伺服控制技术已逐步取代了传统的直流控制技术,越来越多地应用到各种工业控制领域中。现代制造行业的迅速崛起,对伺服控制系统的控制性能提出了更高的要求。要求提高伺服系统的移动
发表于 2018-03-23
基于ATmega16L微处理器的电液伺服控制系统设计
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved