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

📄 main.c

📁 Total_Program(太阳能追踪程序)
💻 C
📖 第 1 页 / 共 2 页
字号:
    		case 9:  Write_Data(0x20);break;//"space"
    		case 10: Write_Data(0x30+j2);break;//"0"
    		case 11: Write_Data(0x30+j3);break;//"0"
    		case 12: Write_Data(0x30+j6);break;//"0"
    		case 13: Write_Data(0x30+j7);break;//"0"
    		case 14: Write_Data(0x20);break;//"space"
    		case 15: Write_Data(0x4a);break;//"J"
    		default:break;
    	}
    }
    Write_Cmd(0x98);            //写第四行的显示地址
    for(i = 0; i < 16; i++)  //显示Num:--U:--I:--对应的字符
    {
    	switch(i)
    	{
    		case 0:  Write_Data(0x4e);break;//"N"
    		case 1:  Write_Data(0x75);break;//"u"
    		case 2:  Write_Data(0x6d);break;//"m"
    		case 3:  Write_Data(0x3a);break;//":"
    		case 4:  Write_Data(0x30+Num);break;//"0"
    		case 5:  Write_Data(0x20);break;//"space"
    		case 6:  Write_Data(0x55);break;//"U"
    		case 7:  Write_Data(0x3a);break;//":"
    		case 8:  Write_Data(0x30+u1);break;//"0"
    		case 9:  Write_Data(0x2e);break;//"."
    		case 10: Write_Data(0x30+u2);break;//"0"
    		case 11: Write_Data(0x49);break;//"I"
    		case 12: Write_Data(0x3a);break;//":"
    		case 13: Write_Data(0x30+i1);break;//"0"
    		case 14: Write_Data(0x2e);break;//"."
    		case 15: Write_Data(0x30+i2);break;//"0"
    		default:break;
    	}
    }
}


#pragma vector=RTC_VECTOR
__interrupt void RTC_ISR(void)
{
  switch(__even_in_range(RTCIV,16))
  {
    case RTC_NONE:                          // No interrupts
      break;
    case RTC_RTCRDYIFG:                     // RTCRDYIFG
     //P5OUT ^= 0x01;                        // Toggles P1.0 every second
      t_sec++;
 //     t_data++;
      W0_data = P_data*1;
      W_data = W0_data +W_data;
      break;
    case RTC_RTCTEVIFG:                     // RTCEVIFG
      __no_operation();                     // Interrupts every minute
      break;
    case RTC_RTCAIFG:                       // RTCAIFG
      break;
    case RTC_RT0PSIFG:                      // RT0PSIFG
      break;
    case RTC_RT1PSIFG:                      // RT1PSIFG
      break;
    case 12: break;                         // Reserved
    case 14: break;                         // Reserved
    case 16: break;                         // Reserved
    default: break;
  }
}

#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{
  static unsigned int index = 0;
  switch(__even_in_range(ADC12IV,34))
  {
  case  0: break;                           // Vector  0:  No interrupt
  case  2: break;                           // Vector  2:  ADC overflow
  case  4: break;                           // Vector  4:  ADC timing overflow
  case  6:                                  // Vector  6:  ADC12IFG0
    break;
  case  8:
	  break;                           // Vector  8:  ADC12IFG1
  case 10: break;                           // Vector 10:  ADC12IFG2
  case 12:
	    A0results[index] = ADC12MEM0;           // Move A0 results, IFG is cleared
	    A1results[index] = ADC12MEM1;           // Move A1 results, IFG is cleared
	    A2results[index] = ADC12MEM2;           // Move A2 results, IFG is cleared
	    A3results[index] = ADC12MEM3;           // Move A3 results, IFG is cleared
	    index++;                                // Increment results index, modulo; Set Breakpoint1 here

	    if (index == 8)
	    	index = 0;							// Reset index, Set breakpoint 2 here
	  break;                           // Vector 12:  ADC12IFG3
  case 14: break;                           // Vector 14:  ADC12IFG4
  case 16: break;                           // Vector 16:  ADC12IFG5
  case 18: break;                           // Vector 18:  ADC12IFG6
  case 20: break;                           // Vector 20:  ADC12IFG7
  case 22: break;                           // Vector 22:  ADC12IFG8
  case 24: break;                           // Vector 24:  ADC12IFG9
  case 26: break;                           // Vector 26:  ADC12IFG10
  case 28: break;                           // Vector 28:  ADC12IFG11
  case 30: break;                           // Vector 30:  ADC12IFG12
  case 32: break;                           // Vector 32:  ADC12IFG13
  case 34: break;                           // Vector 34:  ADC12IFG14
  default: break; 
  }
}
void GPIO_Init()
{
    //Drv8412 io configure
    P4DIR |= BIT3+BIT4;				            //TB0.3=>PWM-C,TB0.4=>PWM-D
    P4SEL |= BIT3+BIT4;
    P7DIR |= BIT3;                                          //  DRV8412 RESET,Low Valid
    P7OUT &=~BIT3;
    P9DIR |= BIT3+BIT2+BIT1;				    // M1\M2\M3=000,Full Bride Output
    P9OUT &=~(BIT3+BIT2+BIT1);
    P7DIR &=~BIT2;				            // /FAULT selsect input
    P2DIR &=~BIT1;				            // /OTW selsect input
    P7OUT |= BIT3;			                    // resume normal operation 
    //ADS1118 SPI IO Configure
    P1OUT |= BIT1;                         	            // Set P1.1 for CS
    P1DIR |= BIT1;                                          // Set P1.1 to output direction
    P3SEL |= BIT7;                                          // P3.7 option select 
    P5SEL |= BIT4+BIT5;					    // P5.4,5 option select
    // P6.0 Measure Frequency
    //P6DIR |= BIT0;
    //P6OUT |= BIT0;
}

void SPI_Init(void)
{
    UCB1CTL1 |= UCSWRST;                                // **Put state machine in reset**
    UCB1CTL0 |= UCMST+UCSYNC+UCMSB;  		    // 3-pin, 8-bit SPI master
                                                        // Clock polarity high, MSB
    UCB1CTL1 |= UCSSEL_2;                               // SMCLK
    UCB1BR0 = 100;                                       // 50 divder
    UCB1BR1 = 0;                                        //
    UCB1CTL1 &= ~UCSWRST;                               // **Initialize USCI state machine**

    __delay_cycles(100);                                // Wait for slave to initialize
}

signed int WriteSPI(unsigned int config, unsigned char mode)
{
	signed int msb;
	unsigned int temp;
	volatile signed int dummy;

	temp = config;
	if (mode==1) temp = 0;
		//temp = (config | 0x8000)&(0xfffD);


	while(!(UCB1IFG&UCTXIFG));
	UCB1TXBUF = (temp >> 8 );				// Write MSB of Config
	while(!(UCB1IFG&UCRXIFG));
	msb = UCB1RXBUF;						// Read MSB of Data

	while(!(UCB1IFG&UCTXIFG));
	UCB1TXBUF = (temp & 0xff);				// Write LSB of Config
	while(!(UCB1IFG&UCRXIFG));
	msb = (msb << 8) | UCB1RXBUF;			// Read LSB of Data

	while(!(UCB1IFG&UCTXIFG));
	UCB1TXBUF = (temp >> 8 );				// Write MSB of Config
	while(!(UCB1IFG&UCRXIFG));
	dummy = UCB1RXBUF;						// Read MSB of Config


	while(!(UCB1IFG&UCTXIFG));
	UCB1TXBUF= (temp & 0xff);				// Write LSB of Config
	while(!(UCB1IFG&UCRXIFG));
	dummy = (dummy <<8) | UCB1RXBUF;		// Read LSB of Config

	__delay_cycles(100);

	return msb;
}
void ADS_Config(signed int temp_config_value)
{
	signed int Config_Value;

	Config_Value = temp_config_value;
	//Config_Value = 0x8583;					// Initial Config Register
	// ADS1118 configuration AIN0/AIN1, FS=+/-2.048, DR=128sps, PULLUP on DOUT

	P1OUT &=~ 0x02;							// Set CS low
	__delay_cycles(100);                    // Wait for slave to initialize

	WriteSPI(Config_Value,0);				// Write configuration to ADS1118

	__delay_cycles(100);                    // Wait for slave to initialize

	P1OUT |= 0x02;							// Set CS high
}

signed int ADS_Read(void)
{
	unsigned int Data, Config_Value;

	//Config_Value = 0x058B;
	Config_Value = 0;
	// ADS1118 configuration AIN0/AIN1, FS=+/-2.048, DR=128sps, PULLUP on DOUT

	P1OUT &=~ 0x02;							// Set CS low
	Data = WriteSPI(Config_Value,1);		// Read data from ADS1118
	P1OUT |= 0x02;							// Set CS high

	return Data;
}

void PID_Init(void)
{
    MinValue=0;                                             //pwmc=1,pwmd=0;
    MaxValue=99;                                            //pwmc=0,pwmd=1;
    Control.Kp=20;
    Control.Ki=0.5;
    Control.Kd=0.0;
    PID_Set=0;                                              // 差分电压为0V	
    Control.OutPut=50;
}
unsigned int PID_Work()
{
    float Up,Ui,Ud;
    float Ax,Bx,Cx,Tx=0.000644;                             // TX:sampling frequency
    Control.ValueSet = PID_Set;	                            //普通增量式PID
    CurrentValue = PID_Measure;
    Control.E = Control.ValueSet-CurrentValue;
    Ax=Control.Kp*(1+Tx/Control.Ki+Control.Kd/Tx);
    Bx=Control.Kp*(1+2*Control.Kd/Tx);
    Cx=Control.Kp*(Control.Kd/Tx);
    Up =Ax*Control.E; 
    Ui = Bx*Control.E1;
    Ud = Cx*Control.E2;
    Control.E2 = Control.E1;
    Control.E1 = Control.E;
    Control.OutPut +=(Up-Ui+Ud);
    if(Control.OutPut<MinValue)
            Control.OutPut=MinValue;                        
    else if (Control.OutPut>MaxValue)
            Control.OutPut=MaxValue;
    return (unsigned int)Control.OutPut;
}

⌨️ 快捷键说明

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