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

📄 main.c

📁 PWM斩波三相逆变电路及PID控制回馈发电源程序
💻 C
字号:
//  基于《Stellaris外设驱动库》的ADC例程:ADC采样结果通过UART发送


//  包含必要的头文件
#include  "UART_GetPut.H"
#include  <hw_types.h>
//#include  <hw_memmap.h>
#include  <hw_sysctl.h>
#include  <hw_gpio.h>
#include  <hw_adc.h>
#include  <sysctl.h>
#include  <gpio.h>
#include  <adc.h>
#include  <stdio.h>
#include  <math.h>

// 将较长的标识符定义为较短的形式
#define  SysCtlPeriEnable       SysCtlPeripheralEnable
#define  SysCtlPeriDisable      SysCtlPeripheralDisable
#define  GPIOPinTypeIn          GPIOPinTypeGPIOInput
#define  GPIOPinTypeOut         GPIOPinTypeGPIOOutput
#define  GPIOPinTypeOD          GPIOPinTypeGPIOOutputOD
#define   ADCSequDataGet        ADCSequenceDataGet 

//  定义KEY
#define  KEY_PERIPH             SYSCTL_PERIPH_GPIOG
#define  KEY_PORT               GPIO_PORTG_BASE
#define  KEY_PIN                GPIO_PIN_5

tBoolean ADC_EndFlag = false;                                   // 定义ADC转换结束的标志
//  防止JTAG失效
void  JTAG_Wait(void)
{
    SysCtlPeriEnable(KEY_PERIPH);                               //  使能KEY所在的GPIO端口
    GPIOPinTypeIn(KEY_PORT , KEY_PIN);                          //  设置KEY所在管脚为输入

    if ( GPIOPinRead(KEY_PORT , KEY_PIN)  ==  0x00 )            //  如果复位时按下KEY,则进入
    {
        for (;;);                                               //  死循环,以等待JTAG连接
    }

    SysCtlPeriDisable(KEY_PERIPH);                              //  禁止KEY所在的GPIO端口
}


//  定义全局的系统时钟变量
unsigned long  TheSysClock  =  12000000UL;


//  延时
void  Delay(unsigned long  ulVal)
{
    while ( --ulVal  !=  0 );
}


//  ADC初始化
void ADC_Init()
{
    SysCtlPeriEnable(SYSCTL_PERIPH_ADC);                        //  使能ADC模块
    SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS);                 //  设置ADC采样率
    ADCSequenceDisable(ADC_BASE , 0);                           //  禁止采样序列

    ADCSequenceConfigure(ADC_BASE ,                             //  采样序列配置
                         0 ,                                    //  采样序列编号
                         ADC_TRIGGER_PROCESSOR ,                //  由处理器触发
                         0);                                    //  设置优先级

    ADCSequenceStepConfigure(ADC_BASE ,                         //  采样步进设置
                             0 ,                                //  采样序列编号
                             0 ,                                //  设置步进
                             ADC_CTL_CH0);        //  通道设置, CHANGE TO adc1,电压采样通道在这里改

    ADCSequenceStepConfigure(ADC_BASE ,
                             0,
                             1,
                             ADC_CTL_END | ADC_CTL_CH1);
                              
    
    
    ADCSequenceEnable(ADC_BASE , 0);                            //  使能采样序列
}


//  系统初始化
void  SystemInit(void)
{
    SysCtlLDOSet(SYSCTL_LDO_2_75V);                             //  配置PLL前须将LDO电压设置为2.75V

    SysCtlClockSet(SYSCTL_USE_PLL |                             //  系统时钟设置,采用PLL
                   SYSCTL_OSC_MAIN |                            //  主振荡器
                   SYSCTL_XTAL_6MHZ |                           //  外接6MHz晶振
                   SYSCTL_SYSDIV_10);                           //  分频结果为20MHz

    TheSysClock  =  SysCtlClockGet();                           //  获取当前的系统时钟频率

    UART_GetPutInit();                                          //  UART收发初始化
    ADC_Init();
}
                                                               // ADC采样:ulVal[ ]保存采样结果
   void adcSample(unsigned long ulVal[ ])
{
   ADCProcessorTrigger(ADC_BASE, 0); // 处理器触发采样序列
   while (!ADC_EndFlag); // 等待采样结束
   ADC_EndFlag = false; // 清除ADC采样结束标志
   ADCSequDataGet(ADC_BASE, 0, ulVal); // 自动读取全部ADC结果
}





int main(void)
{
unsigned long ulVal[2];
//char cBuf[30];
unsigned long i, v;
long Uac;
long Ubc;
float Ud1;
float Uq1;
float Ud[100];
float Uq[100];
//float Us;
//long Ua;
//long Ub;
long Angle;
Ud1=0;
Uq1=0;
//Ud=0;
//Uq=0;

JTAG_Wait( );  // 防止JTAG失效,重要!
//jtag_Wait( );  // 防止JTAG失效,重要!
//clockInit( ); // 时钟初始化:PLL,20MHz
//uartInit( ); // UART初始化
//adcInit( ); // ADC初始化
SystemInit( );


for (;;)
{
adcSample(ulVal); // ADC采样
for (i = 0; i < 2; i++)
{
 v = (ulVal[i] * 3000) / 1024; // 转换成电压值
  if (i==0) Uac=v;
  //sprintf(cBuf, "STEP%d = %d(mV)\r\n", i, v); // 采样值格式化为电压值
  //uartPuts(cBuf); // 通过UART输出电压值
   else Ubc=v;
  //sprintf(cBuf, "STEP%d = %d(mV)\r\n", i, v); // 采样值格式化为电压值
  //uartPuts(cBuf); // 通过UART输出电压值

}

Ud1=Uac-1/2*Ubc;
Uq1=sqrt(3)/2*Ubc;
//Uq1=1/2*Ubc;

for(i=0;i<99;i++)
{Ud[i]=cos(Angle)*Ud1+sin(Angle)*Uq1;
Uq[i]=-sin(Angle)*Ud1+cos(Angle)*Uq1;}
//Us=sqrt(Ud*Ud+Uq*Uq);

//uartPuts("\r\n");
SysCtlDelay(1500 * (TheSysClock / 3000)); // 延时约1500ms
         

                               //zhangweidi
float e[100];
float u[100];
float Time1;
float Time2  ;              //T2占空比
float Time3  ;               //T3占空比
#define umax 1
#define umin 0.5
#define K 100
#define Ti 0.1
#define T 1
#define d0 K*(1+T/Ti)                                             //ti与k都为已知量
#define d1 -K

                                                  


for(i=3;i<99;i++)
{ 
  e[i]=Ud[i]-1;
  u[i-1]= (K*(1+T/Ti))*e[i-1]+d1*e[i-2];
if (u[i-1]>umax)   
    
         if (e[i]>0)  u[i]=K*(e[i]-e[i-1]);
         else u[i]=(K*(1+T/Ti))*e[i]+d1*e[i-1];

else if (u[i-1]<umin)
         
         if (e[i]<0)  u[i]=K*(e[i]-e[i-1]);
         else u[i]=(K*(1+T/Ti))*e[i]+d1*e[i-1];
          
     else u[i]=(K*(1+T/Ti))*e[i]+d1*e[i-1]; 
    
  Time1=u[i];    
  Time2=u[i];
  Time3=u[i];
  
}}}




                        

                                               //pwm
// 定时器16位PWM用法示例

#include  <hw_types.h>
#include  <hw_memmap.h>
#include  <hw_ints.h>
#include  <hw_sysctl.h>
#include  <hw_gpio.h>
#include  <hw_timer.h>
#include  <interrupt.h>
#include  <sysctl.h>
#include  <gpio.h>
#include  <timer.h>
#include  "LM3S1138_PinMap.H"

/*  将较长的标识符定义成较短的形式  */
#define  SysCtlPeriEnable       SysCtlPeripheralEnable
#define  SysCtlPeriDisable      SysCtlPeripheralDisable
#define  GPIOPinTypeIn          GPIOPinTypeGPIOInput
#define  GPIOPinTypeOut         GPIOPinTypeGPIOOutput

/*  定义按键  */
#define  KEY_PORT               SYSCTL_PERIPH_GPIOG
#define  KEY_PIN                GPIO_PORTG_BASE , GPIO_PIN_5
#define  keyGet()               GPIOPinRead(KEY_PIN)


float Time0 ;               //总周期
float Time1;
float Time2  ;              //T2占空比
float Time3  ;               //T3占空比

//  定义全局的系统时钟变量
//unsigned long  TheSysClock  =  12000000UL;

/*  定义定时器  */ 
#define  T1_A                   TIMER1_BASE , TIMER_A
#define  T1_B                   TIMER1_BASE , TIMER_B
#define  T1_BOTH                TIMER1_BASE , TIMER_BOTH
#define  T1_BOTH_CFG_16_PWM     TIMER1_BASE , TIMER_CFG_16_BIT_PAIR | TIMER_CFG_A_PWM | TIMER_CFG_B_PWM

                 //new init timer2

#define  T2_A                   TIMER2_BASE , TIMER_A
#define  T2_BOTH                TIMER2_BASE , TIMER_BOTH
#define  T2_BOTH_CFG_16_PWM     TIMER2_BASE , TIMER_CFG_16_BIT_PAIR | TIMER_CFG_A_PWM | TIMER_CFG_B_PWM
#define Time0 6000
/*  防止JTAG失效  */
void  jtagWait(void)
{
    SysCtlPeriEnable(KEY_PORT);                        /*  使能KEY所在的GPIO端口       */
    GPIOPinTypeIn(KEY_PIN);                             /*  设置KEY所在管脚为输入       */
    if ( keyGet()  ==  0x00 ) {                         /*  如果复位时按下KEY,则进入   */
        for (;;);                                       /*  死循环,以等待JTAG连接      */
    }
    SysCtlPeriDisable(KEY_PORT);                        /*  禁止KEY所在的GPIO端口       */
}






void  timer1Init(void)
{
    SysCtlPeriEnable(CCP2_PERIPH);                      /*  使能CCP2所在的GPIO端口      */
    GPIOPinTypeTimer(CCP2_PORT,CCP2_PIN);               /*  配置CCP2管脚为PWM输出       */

    SysCtlPeriEnable(CCP3_PERIPH);                      /*  使能CCP3所在的GPIO端口      */
    GPIOPinTypeTimer(CCP3_PORT,CCP3_PIN);               /*  配置CCP3管脚为PWM输出       */
    
    SysCtlPeriEnable(CCP4_PERIPH);                      /*  new      */
    GPIOPinTypeTimer(CCP4_PORT,CCP4_PIN);               //  new
    
    SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1);             /*  使能定时器模块              */
    TimerConfigure(T1_BOTH_CFG_16_PWM);                 /*  配置定时器为双16位PWM       */
    TimerControlLevel(T1_BOTH , true);                  /*  控制PWM输出反相             */
    TimerLoadSet(T1_BOTH , Time0);                       /*  设置定时器初值              */
    TimerMatchSet(T1_A , Time1);                         /*  设置TimerA的PWM匹配值       */
    TimerMatchSet(T1_B , Time2);                         /*  设置TimerB的PWM匹配值       */
    TimerEnable(T1_BOTH);                               /*  使能定时器计数,PWM开始输出 */

    TimerConfigure(T2_BOTH_CFG_16_PWM);                 //new
    TimerControlLevel(T2_BOTH , true);                  //功能与上一段一样  
    TimerLoadSet(T2_BOTH , Time0);                      
    TimerMatchSet(T2_A , Time3);                         
    TimerEnable(T2_BOTH);

}



                                                 


⌨️ 快捷键说明

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