⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 NIOS II 的几个源代码
💻 C
字号:
#include <stdio.h>
#include <sys/unistd.h>
#include <io.h>
#include <string.h>

#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h"
#include "main.h"
#include "mydata.h"
#include "draw.h"

/***********************************************/
alt_u8 KeyTab[]={   0x4e,0x67,0x47,0x27,
                    0x6b,0x4b,0x2b,0x6d,
                    0x4d,0x2d,0x07,0x0b,
                    0x0d,0x0e,0x6e,0x2e };
alt_u8 KB_Scan_Tab[8] = {0x0e, 0xff, 0x0d, 0xff, 0x0b, 0xff, 0x07, 0xff};

alt_u8 KeyValue, mKey;
alt_u8 KeyScanNum, PressedKeyNum = 0, KeyPressedFlag;
alt_u16 OldWaveDat[WAVE_DOTS];
alt_u16 WaveDatBuff[WAVE_DOTS]; //波形缓冲区
alt_u16 mSet_Speed, mNow_Speed, mSet_Temp;
alt_u16 PWM_Value;
alt_u16 Speed_Index;

alt_u8 ExpTitle[] = "-==-直流电机闭环调速实验-==-";
alt_u8 PWMTxt[] = "当前PWM占空比:";
alt_u8 SetSpeedTxt[] = "设定转速:";
alt_u8 NowSpeedTxt[] = "当前转速:";
alt_u8 SetSpeedBuff[] = "xxrps";
alt_u8 NowSpeedBuff[] = "xxrps";
alt_u8 PWMBuff[] = "xx%";
alt_u8 SetSpeedRange[] = "转速设定范围:15 ~ 70rps";
alt_u8 OperateTxt[] = "按数字键0~9设定转速,按'#'键确定";
/***********************************************/
int main(void)
{
  alt_u16 i;
  alt_u16 save_delay = 0;
  alt_u16 disp_flag = true;
  printf("\n Exp22 - DC. Motor Control!\n");

  mSet_Speed = mSet_Temp = 50;
  PWM_Value = 680;
  Speed_Index = 0;
  
  DrawFillRect(0, 0, 640, 480, COLOR_BLACK);
  Init_Disp_Grid(WAVE_X, WAVE_Y);   //初始化并显示波形参考格子
  //初始化PWM值
  IOWR_ALTERA_AVALON_PIO_DATA(PWM_BASE, PWM_Value);
  DisplayAnyString(SetSpeedTxt, PARAM_X, PARAM_Y, COLOR_BLACK, COLOR_RED);
  DisplayAnyString(NowSpeedTxt, PARAM_X + 200, PARAM_Y, COLOR_BLACK, COLOR_YELLOW);
  DisplayAnyString(PWMTxt, PARAM_X + 400, PARAM_Y, COLOR_BLACK, COLOR_BLUE);
  
  //显示速度设定范围
  DisplayAnyString(SetSpeedRange, PARAM_X, PARAM_Y + 30, COLOR_WHITE, COLOR_BLUE);
  DisplayAnyString(OperateTxt, PARAM_X, PARAM_Y + 50, COLOR_WHITE, COLOR_BLUE);
  //显示标题
  DisplayAnyString(ExpTitle, 208, 16, COLOR_BLUE, COLOR_CYAN);
  
  //清空波形缓冲区
  for(i=0; i<sizeof(WaveDatBuff); i++)
    WaveDatBuff[i] = 0;

  while(1)
  {
    save_delay++;
    if(save_delay % 100 == 0)
    {
      //存储当前转速值
      if(mNow_Speed > 69)
        mNow_Speed = 69;
      if(Speed_Index < WAVE_DOTS)
        WaveDatBuff[Speed_Index++] = mNow_Speed * 4;
      else
      {
        for(i=0; i<WAVE_DOTS-1; i++)
          WaveDatBuff[i] = WaveDatBuff[i+1];
        WaveDatBuff[i] = mNow_Speed * 4;
      }
      disp_flag = true;
    }  
    if(disp_flag)  //显示转速调整波形
    {
      disp_flag = false;
      Display_Wave(WAVE_X + 10, WAVE_Y-1, OldWaveDat, COLOR_BLACK);
      Display_Wave(WAVE_X + 10, WAVE_Y-1, WaveDatBuff, COLOR_ORANGE);
      //显示设定转速
      SetSpeedBuff[0] = mSet_Temp / 10 + '0';
      SetSpeedBuff[1] = mSet_Temp % 10 + '0';
      DisplayAnyString(SetSpeedBuff, PARAM_X + 72, PARAM_Y, COLOR_BLACK, COLOR_RED);
      //显示当前转速
      mNow_Speed = IORD_ALTERA_AVALON_PIO_DATA(SPEED_BASE);
      NowSpeedBuff[0] = mNow_Speed / 10 + '0';
      NowSpeedBuff[1] = mNow_Speed % 10 + '0';
      DisplayAnyString(NowSpeedBuff, PARAM_X + 272, PARAM_Y, COLOR_BLACK, COLOR_YELLOW);
      //显示当前PWM输出值
      PWMBuff[0] = PWM_Value / 100 + '0';
      PWMBuff[1] = (PWM_Value % 100) / 10 + '0';
      DisplayAnyString(PWMBuff, PARAM_X + 512, PARAM_Y, COLOR_BLACK, COLOR_BLUE);
      ChangePWM();
    }
    
    KeyScanNum = (KeyScanNum + 1) % 8;
    //判断有无按键按下
    IOWR_ALTERA_AVALON_PIO_DATA(KEY_COL_BASE, KB_Scan_Tab[KeyScanNum]);  
    KeyValue = IORD_ALTERA_AVALON_PIO_DATA(KEY_ROW_BASE) & 0x0f;
    if(KeyValue != 0x0f && !KeyPressedFlag)
    {
      KeyPressedFlag = true;
      PressedKeyNum = KeyScanNum;
      //转换键值
      KeyValue |= KeyScanNum << 4;
      for(i=0; i<16; i++)
      {
        if(KeyValue == KeyTab[i])
        {
          mKey = i;
          i = 16;
          disp_flag = true;
        }
      }
      if(mKey <= 9)
        mSet_Temp = (mSet_Temp % 10) * 10 + mKey;
      else if(mKey == 12)   //'C' - Cancel
        mSet_Temp = mSet_Speed;
      else if(mKey == 15)   //'#' - Enter
      {
        for(i=0; i<WAVE_DOTS; i+=4)
          Draw_Pixel(WAVE_X + 10+i, WAVE_Y-1+GD_H-mSet_Speed*4+1, COLOR_BLACK); 
        if(mSet_Temp >= 15 && mSet_Temp <= 70)
          mSet_Speed = mSet_Temp;
        else
          mSet_Temp = mSet_Speed;
      }
    }
    else if(PressedKeyNum == KeyScanNum && KeyValue == 0x0f && KeyPressedFlag)
      KeyPressedFlag = false;

    usleep(10000);
  }
  return 0;
}

void ChangePWM(void)   //调节PWM输出
{
   alt_u16 i;
   if(mNow_Speed > mSet_Speed)
   {
      i = PWM_Value > 100 ? (mNow_Speed - mSet_Speed) : (mNow_Speed - mSet_Speed) / 2;  
      PWM_Value -= i;   //*0.5
   }
   else
   {
      i = PWM_Value > 100 ? (mSet_Speed - mNow_Speed) : (mSet_Speed - mNow_Speed) / 2;
      PWM_Value += i;   //*0.5
   }
   if(PWM_Value<1)
      PWM_Value=1;
   else if(PWM_Value>999)
      PWM_Value=999;
   IOWR_ALTERA_AVALON_PIO_DATA(PWM_BASE, PWM_Value);  
}

/*******************************************************/
alt_u8 Grid_Title[] = "×10转/秒";
void Init_Disp_Grid(alt_u16 xp, alt_u16 yp)   //初始化并显示示波器参考格子
{
  alt_u16 i, j, k;
  alt_u16 color = COLOR_GREEN;
  //画横坐标
  DrawLine(xp, yp+GD_H, xp+GD_W, yp+GD_H, color);
  for(i=0; i<4; i++)
  {
    Draw_Pixel(xp+GD_W-i, yp+GD_H-i, color);
    Draw_Pixel(xp+GD_W-i, yp+GD_H+i, color);
  }
  
  DrawLine(xp, yp, xp, yp+GD_H, color);
   for(i=0; i<4; i++)
  {
    Draw_Pixel(xp-i, yp+i, color);
    Draw_Pixel(xp+i, yp+i, color);
  }
  
  //画纵坐标
  for(i=40; i<GD_H; i+=8)
  {
      k= i%40==0 ? 8 : 4;
      for(j=1; j<k; j++)
        Draw_Pixel(xp+j, yp+i, color);
  }

  for(i=0; i<= 7; i++)
    DisplayChar(i + '0', xp - 16, yp + GD_H - i*UNIT_GD - 8, COLOR_BLACK, color);
  DisplayAnyString(Grid_Title, xp + 8, yp, COLOR_BLACK, color);

}
    
void Display_Wave(alt_u16 xp, alt_u16 yp, alt_u16 *wave, alt_u16 color)  //显示波形
{
   alt_u16 i,j, k;
   alt_u16 m, n;
   j = WAVE_DOTS;
   do
      j--;
   while(j && wave[j]==0);
   
   OldWaveDat[0] = m = *wave++;
   for(i=1; i<j; i++)
   {
      OldWaveDat[i] = n = *wave++;
      for(k=m;k<=n;k++)
        Draw_Pixel(xp+i, yp+GD_H-k, color);
      for(k=n;k<=m;k++)
        Draw_Pixel(xp+i, yp+GD_H-k, color);                    
      m = n;
   }   
   
   //速度设定标竿
   for(i=0; i<WAVE_DOTS; i+=4)
     Draw_Pixel(xp+i, yp+GD_H-mSet_Speed*4+1, COLOR_GREEN);
   
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -