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