关于低功耗msp430PID控制电机转速的C程序

发布者:MysticSerenade最新更新时间:2020-07-29 来源: 51hei关键字:低功耗  msp430  PID控制  电机转速 手机看文章 扫描二维码
随时随地手机看文章

#include

#include

#include

unsigned int cap_tar,cap_first,cap_last,time,pluse,flag=0,temp1;

float speed,Uk,vis=0,temp2=0;

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

函数名称:定时器中断服务函数

功    能:用于捕捉传感器的脉冲信号

参    数:无

返回值  :无

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

#pragma vector=TIMERA0_VECTOR

__interrupt void timerA0(void)

{

  if(cap_tar==0)

  {

    cap_first=TACCR0;

    cap_tar++;

  }

  else

  {

    cap_last=TACCR0;

    cap_tar++;

    flag=1;

  }

}

#pragma vector=TIMERA1_VECTOR

__interrupt void timerA1(void)

{  

  switch(TAIV)

  {

  case 2:break;

  case 4:break;

  case 10:

    {     

       if(cap_last>cap_first)

        {

         if(cap_tar==0)  

            pluse=0;

         else

          {

            pluse=cap_tar-1;

            time=cap_last-cap_first;

            cap_tar=0;

          }

        }

      }   

    break;

  }

}

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

函数名称:Count_speed

功    能:计算实际转速

参    数:无

返回值  :实际转速

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

float Count_speed(int pluse,int time)

{

    float ActualSpeed;

    ActualSpeed = 2682062.0*pluse/time;   //基础脉冲一圈一个信号

    return ActualSpeed;

}  

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

函数名称:增量式PID控制程序

功    能:用PID反馈控制输出一个反馈控制量

参    数:无

返回值  :UK控制量

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

struct _pid{

float SetSpeed;//定义设定值

float ActualSpeed;//定义实际值

float err0,err1,err2; //定义偏差值

float Kp,Ki,Kd;//定义比例、积分、微分系数

float Uk0,Uk1;//控制执行器的变量

}pid;

void PID_init(){

pid.SetSpeed=0.0;

        pid.ActualSpeed=0.0;

pid.err0=0.0;

pid.err1=0.0;

        pid.err2=0.0;

pid.Uk0=0.0;

        pid.Uk1=0.0;

pid.Kp=8;

pid.Ki=3;

pid.Kd=1;      

}        

float PID_realize(float ActuaSpeed)

{

  pid.SetSpeed=3000;

  pid.ActualSpeed=ActuaSpeed;

  pid.err0 = pid.SetSpeed - pid.ActualSpeed;

  pid.Uk0 = pid.Uk1+pid.Kp*(pid.err0-pid.err1)+pid.Ki*pid.err0+pid.Kd*(pid.err0-pid.err1-pid.err1+pid.err2);

  if(pid.Uk0>1023)

  {

    pid.Uk0=1023;   

  }

  if(pid.Uk0<0)   

  {

    pid.Uk0=1;

  }

  pid.Uk1 = pid.Uk0;

  pid.err2 = pid.err1;

  pid.err1 = pid.err0;

  Uk = pid.Uk0;

  return Uk;  

}

int main(){  

             float ActualSpeed=0;

             volatile unsigned int i;

            

             P1DIR = 0XFF;P1OUT = 0XFF;

             P2DIR = 0XFF;P2OUT = 0XFF;

             P3DIR = 0XFF;P3OUT = 0XFF;

             P4DIR = 0XFF;P4OUT = 0XFF;

             P5DIR = 0XFF;P5OUT = 0XFF;

             P6DIR = 0XFF;P6OUT = 0XFF;

   

             WDTCTL = WDTPW + WDTHOLD;   //停止看门狗

             BCSCTL1 &= ~XT2OFF;

            

              do

                {

                  IFG1 &= ~OFIFG;                           // Clear OSCFault flag

                  for (i = 0xFF; i > 0; i--);               // Time for flag to set

                }

              while ((IFG1 & OFIFG));

              

              BCSCTL2 |=SELM_2+ SELS;

              TACTL=TASSEL_1+MC_2+TACLR+TAIE;

              TACCTL0=CM_1+SCS+CCIS_0+CAP+CCIE;

              P1DIR&=~BIT1;

              P1SEL|=BIT1;

              

              TBCCTL0 = CCIE;                   //使能CCR0中断

              TBCCR0 = 4;

              TBCTL = TBSSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,增计数模式

              _EINT();


              PID_init();

              

             ActualSpeed=Count_speed(pluse,time);

            

             while(ActualSpeed!=3000.0)

                  {

                    

                   float PID_realize(float ActuaSpeed);

                  

                   BCSCTL1 |= XTS;

                   BCSCTL2 |= SELM_3;                        // MCLK=LFXT1

                   P1DIR |= 0x0C;                            // P1.2 输出

                   P1SEL |= 0x0C;

                   TACTL = TASSEL_1 + MC_1;                  // ACLK, 增计数模式

                   CCR0 = 512-1;                             // PWM 周期

                   CCTL1 = OUTMOD_7;         // CCR1 重置/设置

                   CCR1 = (int)Uk;                         // CCR1 PWM占空比

                   _BIS_SR(LPM0_bits);

                  

                   ActualSpeed=Count_speed(pluse,time);

                  

                  }

            

}


关键字:低功耗  msp430  PID控制  电机转速 引用地址:关于低功耗msp430PID控制电机转速的C程序

上一篇:msp430f149单片机+4*4键盘+1602程序
下一篇:mpu6050六轴传感器msp430驱动程序

推荐阅读最新更新时间:2024-11-10 12:58

神级DIY:智能灌溉器解决盆栽植物浇水难题
在TI,我们欢迎那些在业余时间享受发明与创新的创客和爱好者。在德州仪器持续推出的 神级DIY 系列博客中,我们将为大家分享他们通过TI的技术所创造的奇妙发明。 摘要:精心培养的盆栽植物总是在炎炎的夏日因为忘记浇水而枯萎死去,虽然现在市场上已经推出了智能浇水工具,但是往往都是针对大型温室或花园的灌溉系统。如何能够在节约花费同时保证安全的情况下让盆栽植物实现智能灌溉呢?或许TI MSP MCU产品营销工程师Dave Smith的故事能够为您带来一些自己动手的灵感。 Dave Smith酷爱烹饪。而能够给他带来同样满足感的事情就是从盆栽中摘下一个成熟的辣椒,把它扔到炖锅中,使之成为他最新烹饪乐趣的点睛之笔。
[单片机]
神级DIY:智能灌溉器解决盆栽植物浇水难题
MSP430F5529 DriverLib 库函数学习笔记(四点五)printf打印输出
平台:Code Composer Studio 10.3.1 MSP430F5529 LaunchPad™ Development Kit (MSP‑EXP430F5529LP) 代码实现 重定向fputc(int ch, FILE *f)直接使用printf的方法只有字符串和%s打印正常,数字打印不出来 只好换成这个。 这个程序是我以前写在STM32里的,现在移植过来,效果依然不错。 #include string.h #include stdarg.h #include stdio.h void UART_printf(uint16_t baseAddress, const char *format,...) {
[单片机]
<font color='red'>MSP430</font>F5529 DriverLib 库函数学习笔记(四点五)printf打印输出
基于MSP430F4250的高精度电子天平设计
引言 随着现代电子技术和微电脑技术的迅速发展,应用到天平领域,出现了电子天平。从上世纪七十年代末期出现世界上第一台电子天平起,短短三十几年中,发展出了各种规格,门类齐全的系列电子天平,广泛应用于各行各业的质量计量。 我国电子天平的发展,紧随国际发达国家之后,于上世纪八十年代初期开始,现已形成规模化生产并广泛应用到国内各领域,同时也部分出口世界上许多国家。 电子天平具有数字显示,直接读数、快速称量、重量轻、操作简便,抗干扰能力强等特点,并采用了微机技术使得智能化、多功能,可与打印机、计算机相联机进行在线测量,数据统计分析等,使电子天平具有机械天平无法比拟的优点,因此应用范围越来越广泛。 本设计的电子天平采用高性能单片
[单片机]
基于<font color='red'>MSP430</font>F4250的高精度电子天平设计
MSP430之如何降低系统功耗1
众所周知,MSP430以其超低功耗而著称。但是很多用户反应,在实际应用中,测量MSP430的功耗时,测量结果和MSP430数据手册相差甚远。其实这里主要涉及到两方面的内容: 1. 如何使用MSP430合理的设计硬件和软件,使整个应用最大限度的达到低功耗? 2. 如何测量MSP430的功耗? 就如何测量MSP430功耗,我来分享一下我个人的经验。 一、未使用的GPIO的处理 为了使MSP430最大限度的达到低功耗,对于MSP430未使用的GPIO而言,应该将其设置为输出;或者是设置为输入,但是将管脚的电平固定,可以通过外部电路将管脚连接至Vcc或者GND,也可使能内部上下拉电阻,将管脚电平固定。 对于MSP430而言,大
[单片机]
<font color='red'>MSP430</font>之如何降低系统功耗1
msp430f149单片机串口C程序
msp430f149单片机简介: MSP430系列单片机是美国德州仪器(TI)1996年开始推向市场的一种16位超低功耗、具有精简指令集(RISC)的混合信号处理器(Mixed Signal Processor)。 msp430f149是基于闪存或 ROM 的超低功耗 MCU,提供 8MIPS,工作电压为 1.8V - 3.6V,具有高达 60KB 的闪存和各种高性能模拟及智能数字外设。 超低功耗低至: 0.1μA RAM (保持模式) 0.7μA (实时时钟模式) 200μA/MIPS (工作模式) 在 6μs 之内快速从待机模式唤醒 器件参数: 闪存选项:1KB – 60KB ROM 选项:1KB – 16KB RAM 选项
[单片机]
加快低功耗蓝牙技术的开发
电子消费品市场正在争先恐后地推出下一代物联网产品,以期赢得客户的芳心。从体质监测器、 智能门锁、灯泡到智能水杯,产品公司在这些新兴市场竞相建立自己的统治地位。如今,这些产品中的大部分都功能相似,差异甚微。除了产品设计与外形上的区别之外,胜出的产品一般是首先上市的产品。经过此前许多失败的的众筹项目的教训,提前宣传的“雾件”已经不再能够赢得聪明的消费者了。 当务之急是概念化具有不同功能的新物联网产品,而更重要的是尽快让这些产品上市。但如果您曾开发过商业级无线产品,就会知道推出开发周期短的产品有多困难,尤其是当开发者并没有处理无线标准认证与监管审批的专业经验的时候,而这些认证与审批是在成熟的消费市场销售这些产品的准入条件。此外,由于
[物联网]
加快<font color='red'>低功耗</font>蓝牙技术的开发
高通发布低功耗蓝牙芯片干掉耳机接口:无线耳机成必备
  虽说跟苹果的关系处的不融洽,但 高通 在安卓手机中的地位还是无人能撼动的,更何况他们还是整个基带领域绝对的老大,想要绕开他们真的很难。下面就随手机便携小编一起来了解一下相关内容吧。   也正是鉴于他们在手机行业的领导地位,所以 高通 的一举一动都格外让人注意,因为他们的推新往往直接让终端厂商跟着一起调整,比如最新发布的QCC5100 低功耗蓝牙 芯片。      高通发布低功耗蓝牙芯片干掉耳机接口:无线耳机成必备   对于 高通 来说,QCC5100的提升还是很大的,比如支持蓝牙5.0协议,基础处理能力比上一代至少提升一倍,这也意味着新的芯片将提供更强大的主动降噪和助听功能。   最值得一提的是,QCC5100 低功耗蓝
[手机便携]
基于MSP430F169的模拟装置
  引言   目前,煤炭、石油等能源正走向枯竭,且环境污染问题也日益严重,新能源和可再生能源的利用已经成为世界各国的燃眉之急。作为一种无污染的可再生能源,太阳能越来越受到人们的青睐。太阳能光伏并网发电产业迅速发展对人们提出的可持续发展有重大的意义。本设计利用锁相环倍频、比较器过零触发和MSP430F169单片机DA产生与输入信号同频同相且幅值可控的正弦波,作为DA-AC电路的输入参考信号,其中DA-AC电路采用D类功放中自激反馈模型,利用负反馈的自激振荡产生正弦波脉宽调制(SPWM)波,通过硬件之间的配合,实现了逆变电压输出及最大功率、同频同相的跟踪。   装置方案的选用   DC-AC逆变方案:采用D类功放中自振荡
[单片机]
基于<font color='red'>MSP430</font>F169的模拟装置
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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