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

📄 main.c

📁 我编写的一个mc9s12dg128的一个电机pid调速代码,可以使用键盘控制转速并且在数码管上显示当前速度
💻 C
字号:
/**************************************************/
/****该程序来自于智能车制作WWW.INTELLIGENTCAR.CN***/
/****************程序问题请与作者联系**************/
/**********BY DEMON EMALI:WANGPANBAO@126.COM*******/
/**************************************************/
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

unsigned char led[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F, 0x77,0x7C,0x39,0x5E,0x79,0x71};	 //LED显示字库
#define vel PWMDTY23 //定义vel为PWM输出(PWM3端口)
int num=0/*LED显示用*/,speed=0/*测量速度*/,setspeed=0/*设定速度*/,speedresetflag=0/*给定归零标志*/,lastspeed=0/*上次速度*/;
  /*-------串口初始化----------------------*/
void SciInit(){
  SCI0BDL = (unsigned char)((16000000UL /* OSC freq */ / 2) / 9600 /* baud rate */ / 16 /*factor*/);  //波特率设定
  SCI0CR1=0;					/*normal,no parity*/
  SCI0CR2=0X2C;       /*RIE=1,TE=1,RE=1*/
}

/*-------发射端程序----------------------*/
void SciTx(unsigned char text){
  while (!(SCI0SR1&0x80));  /* wait for output buffer empty */
  SCI0DRH=0;
  SCI0DRL=text;
}

int n;





void main()
{ 
     int i,j,a,b,c,d,e=0,f=0,g=0,h=0;
	PORTB=0x00;	 
  DDRB=0xFF;
  PORTA=0xFF;	 

DDRA_BIT0=1;
DDRA_BIT1=1;
DDRA_BIT2=1;
DDRA_BIT3=1;
DDRA_BIT4=0;
DDRA_BIT5=0;
DDRA_BIT6=0;
DDRA_BIT7=1;
PUCR_PUPAE=1;     //以上为PORTA,PORTB初始化
  
  
  
SciInit();	


PWME=0xaa;//通道01,23,45,67使能		
PWMPOL=0xaa;//通道01,23,45,67输出波形开始极性为1 
PWMCTL=0xf0;//通道01,23,45,67级联   
PWMCLK=0x02;//通道01选择SA为时钟源   
PWMSCLA=0X05;//通道01时钟SA为3MHz(24/(2*4))
PWMPER01=60000;//设定通道01输出频率(50Hz)
PWMPER23=24000;//设定通道23输出频率(1KHz)
PWMPER45=24000;//设定通道45输出频率(1KHz)
PWMPER67=24000;//设定通道67输出频率(1KHz)

PWMDTY01=4500;
PWMDTY23=0;
PWMDTY45=0;    //以上为PWM初始化(通道01为舵机控制保留,可直接使用)



TSCR2=0x07;//频率设定
TSCR1=0x90;//Timer enable and TFLG1 can be cleared auto
TIE=0x01;// Timer0 Interrupt enable
PACTL=0x50;//脉冲累加器初始化 
TCTL4=0x01;
ICPAR_PA1EN=1;
TIOS_IOS0=1;     //以上为定时器模块初始化








   while(1)
  {	   EnableInterrupts; 
  




			 a=setspeed/10; 
  	  for(i=0;i<200;i++)   {PORTA=(PORTA&0xf0)+0x08;PORTB=led[a]; }
  	  
  	  b=setspeed-a*10;
  	 for(i=0;i<200;i++)  {PORTA=(PORTA&0xf0)+0x04;PORTB=led[b]; }				 //设定速度值在LED上显示



  	   c=num/10;
  	  for(i=0;i<200;i++)   {PORTA=(PORTA&0xf0)+0x02;PORTB=led[c]; }
  	  
  	    d=num-c*10;
    for(i=0;i<200;i++)  {PORTA=(PORTA&0xf0)+0x01;PORTB=led[d]; }	       	//测量速度值在LED上显示


  		   

     
    j++;
    
  
    
    
	 
  if(j>10) {j=0;SciTx(' ');SciTx(c+48);SciTx(d+48);SciTx(' ');num=speed;}		 //定时向串口发送速度值
  
  
  
  
 if(PORTA_BIT4==0) e++;   
 if(e>40)  {e=0;setspeed--;}
  
 if(PORTA_BIT5==0) f++;                
 if(f>40)  {f=0;setspeed++;}  
 if(setspeed>=90) setspeed=90;
 
 if(PORTA_BIT6==0) g++;                
 if(g>40)  {g=0;h++;if(h==1) setspeed=30; if(h==2) setspeed=60; if(h==3) setspeed=90; if(h==4) setspeed=0; if(h==5) h=0;}  
 
 
  
 if(setspeed<=0) setspeed=0; 
 if(setspeed==0) PORTA_BIT7=0;
  else PORTA_BIT7=1;              
  //以上为键盘控制, PORTA_BIT4控制设定速度递减,PORTA_BIT5控制设定速度递增
  //PORTA_BIT6控制设定速度30为单位增加

⌨️ 快捷键说明

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