📄 main.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 + -