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

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控制  电机转速 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic504671.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

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

推荐阅读

STM8L 超低功耗八位微控制器简介
超低功耗微控制器平台低功耗的承诺● 从STM8L到STM32L完整的低功耗微控制器平台● 采用最新、超低漏电流的工艺● 极大的改善包括动态和静态的功耗高效率的承诺● 由于采用最新的架构,性能/功耗比达到新高● 运行模式功耗低至:150 μA/MHz● 在低功耗模式下,仅需350nA,SRAM和寄存器数据还可以保留优化的产品分布● 采用通用单片机从8位到32位全覆盖的策略● 针对特殊的应用,提供片上集成的安全特性● 最佳的性价比低功耗的要点超低功耗130nm工艺● 在全温度范围内超低漏电流,工作电压低至1.8V.● 性能和功耗与工作电压密切相关的。低功耗设计● 自动时钟门控● 带有自动进入低功耗功能的闪存● DAC 和ADC工作电压
发表于 2020-07-23
SiFive发布全新RISC-V内核20G1,更高计算和更低功耗
RISC-V处理器IP供应商SiFive发布了其产品的一系列升级,以提高性能并减少功耗和芯片面积。该版本被称为“ 20G1”,该公司的产品命名已从“年-月”命名转换为“年-版本号”的命名方式:20G1是2020年的首个“通用IP”发布,历经9个月的辛勤工作,SiFive表示,“公司将根据路线图制定新的发布时间表,并与客户的开发周期保持一致。”比如,20G1 U74应用处理器针对高端Linux功能优化增强,使与上一代U74相比,功耗降低了25%以上,同时将流媒体数据应用程序(如AI加速)的负载带宽提高了2.8倍。其他SiFive内核也都有进一步的提升,无论是功耗还是处理速度方面。另一个变化是,低端E3系列和E7系列现已具有RISC
发表于 2020-07-23
基于MSP430的NRF24L01 低功耗无线收发程序
单片机源程序如下://接收函数,收到数据后,通过串口显示,串口拨特率设置9600#include <msp430x14x.h>#include "stdio.h"#include "common.h"#include "nrf2401.h"#include "key.h"#include "adc.h"#include "oled.h"#include "cc1101.h"unsigned int adczhi;unsigned char  adl,adh,key
发表于 2020-07-23
大幅延长电池寿命,Maxim 超低功耗、BLE 5.2双核微控制器问市
Maxim Integrated Products, Inc (NASDAQ: MXIM) 宣布推出支持无线连接的MAX32666微控制器(MCU),帮助设计者将纽扣电池供电的物联网(IoT)产品BOM成本降低三分之一,并大幅节省空间、延长电池寿命。这款超低功耗双核Arm® Cortex®-M4 MCU具有浮点运算单元(FPU)和低功耗蓝牙5.2 (BLE 5.2),在单一芯片内集成了传统上多片MCU才具备的可靠存储器、安全功能、通信、电源管理和处理功能,从而有效延长设备的电池工作寿命。                  
发表于 2020-07-22
大幅延长电池寿命,Maxim 超<font color='red'>低功耗</font>、BLE 5.2双核微控制器问市
布局8年,锐成芯微低功耗模拟IP的抢先之道
集微直播间自开播以来获得了大量来自行业的关注与好评。其中“集微公开课”栏目联合行业头部企业,通过线上直播的方式分享精彩主题内容,同时设立直播间文字提问互动环节。集微网希望将“集微公开课”栏目打造成中国ICT产业最专业、优质的线上培训课程,深化产教融合,助力中国ICT产业发展。第29期“集微公开课”于7月21日(周二)上午10:00直播,邀请到成都锐成芯微科技股份有限公司创始人兼CEO 向建军,带来以《ACTT低功耗模拟IP平台助力中国芯》为主题的精彩演讲。成都锐成芯微科技股份有限公司(ACTT)是本土一家专注于IP大平台建设的国产IP供应商,为客户提供自主知识产权的物联网超低功耗模拟IP、高可靠性eNVM、射频电路和高速接口IP
发表于 2020-07-22
布局8年,锐成芯微<font color='red'>低功耗</font>模拟IP的抢先之道
STM8S如何实现Atomthreads最低功耗
(status);  }针对STM8我们最自然想到的是在其中加一个wfi,STM8进入wfi模式几乎不会影响任何外设的运行。以STM8S105K4为例,其进入该模式的典型电流是1.8mA。这个电流,用一节2000mA手机供电,理论上也最多能坚持46天,才一个月多点。这个记录太差了。STM8还有一个HALT模式,这是该芯片的最低功耗模式,电流是uA级别。但是该模式有诸多限制,进入该模式系统几乎所有的clock都停止,你的TImer,adc,uart等等全部停止,除了AWU。atomthreads如果你在idle直接进入HALT,因为基本只有外部中断可以唤醒退出这个模式,当系统醒来了,请你想想,你的系统心跳还准么?你的应用线程
发表于 2020-07-21
STM8S如何实现Atomthreads最<font color='red'>低功耗</font>
小广播
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved