参赛类型:开关电源类
带上位机仿真
原理图
源代码
//*****************************************************************************
//
//
//*****************************************************************************
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_adc.h"
#include "driverlib/debug.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "driverlib/timer.h"
#include "driverlib/pwm.h"
#include "driverlib/adc.h"
//#include "driverlib/watchdog.h"
/*******************************************************************************
LCD:OKI M5265
GND DATA:PD7
GND CLK :PD6
VCC LAH :PD5
*******************************************************************************/
#define SET_LCD_DATA GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_7,GPIO_PIN_7);
#define CLR_LCD_DATA GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_7,0);
#define SET_LCD_CLK GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6,GPIO_PIN_6);
#define CLR_LCD_CLK GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6,0);
#define SET_LCD_LAH GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_5,GPIO_PIN_5);
#define CLR_LCD_LAH GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_5,0);
//*****************************************************************************
//*****************************************************************************
unsigned long g_ulFlags=0;
unsigned long ulADC0_Value[2];
unsigned long ulData; /* 采样数据缓冲器 */
static unsigned char flag_Charge; /* 采样次数 */
unsigned char flag_ADC_finish = 0; /* 采样完成标志 */
unsigned int Charge_Val[3] = {0, 0, 0}; /* 存放采样数据 */
unsigned long ulPeriod; //PWM周期
//LCD相关
unsigned char Display_Buff[20];
//const unsigned char seg_code[10]={};
typedef union
{
unsigned char dt;
struct
{
unsigned char bit0:1,
bit1:1,
bit2:1,
bit3:1,
bit4:1,
bit5:1,
bit6:1,
bit7:1;
};
}T_;
T_ T,c1,c2,c3,c4;
//米形数码
#define c c1.bit0
#define d c1.bit2
#define e c1.bit4
#define a c2.bit5
#define f c2.bit4
#define g c2.bit3
#define b c2.bit0
//田形数码
#define aa c3.bit2
#define bb c3.bit3
#define ff c3.bit1
#define dd c3.bit0
#define cc c4.bit4
#define ee c4.bit1
#define gg c4.bit3
typedef union
{
unsigned char ucdata[2];
unsigned int uidata ;
}uc2ul;
unsigned int PWMA,PWMB;
unsigned char D[6];
//*****************************************************************************
//函数名称:void recode(unsigned char *data,unsigned char yd)
//输入参数:unsigned char *data,unsigned char yd
//输出参数:void
//功能:数字0~9对应显示段码列表
//*****************************************************************************
void recode(unsigned char *data,unsigned char yd)
{
switch(yd)
{
case 0: a=1;b=1;c=1;d=1;e=1;f=1;g=0;break;
case 1: a=0;b=1;c=1;d=0;e=0;f=0;g=0;break;
case 2: a=1;b=1;c=0;d=1;e=1;f=0;g=1;break;
case 3: a=1;b=1;c=1;d=1;e=0;f=0;g=1;break;
case 4: a=0;b=1;c=1;d=0;e=0;f=1;g=1;break;
case 5: a=1;b=0;c=1;d=1;e=0;f=1;g=1;break;
case 6: a=1;b=0;c=1;d=1;e=1;f=1;g=1;break;
case 7: a=1;b=1;c=1;d=0;e=0;f=0;g=0;break;
case 8: a=1;b=1;c=1;d=1;e=1;f=1;g=1;break;
case 9: a=1;b=1;c=1;d=1;e=0;f=1;g=1;break;
}
*data=c1.dt;
*(data+10)=c2.dt;
}
//*****************************************************************************
//函数名称:void recode1(unsigned char *data,unsigned char yd)
//输入参数:unsigned char *data,unsigned char yd
//输出参数:void
//功能:数字0~9对应显示段码列表
//*****************************************************************************
void recode1(unsigned char *data,unsigned char yd)
{
switch(yd)
{
case 0: aa=1;bb=1;cc=1;dd=1;ee=1;ff=1;gg=0;break;
case 1: aa=0;bb=1;cc=1;dd=0;ee=0;ff=0;gg=0;break;
case 2: aa=1;bb=1;cc=0;dd=1;ee=1;ff=0;gg=1;break;
case 3: aa=1;bb=1;cc=1;dd=1;ee=0;ff=0;gg=1;break;
case 4: aa=0;bb=1;cc=1;dd=0;ee=0;ff=1;gg=1;break;
case 5: aa=1;bb=0;cc=1;dd=1;ee=0;ff=1;gg=1;break;
case 6: aa=1;bb=0;cc=1;dd=1;ee=1;ff=1;gg=1;break;
case 7: aa=1;bb=1;cc=1;dd=0;ee=0;ff=0;gg=0;break;
case 8: aa=1;bb=1;cc=1;dd=1;ee=1;ff=1;gg=1;break;
case 9: aa=1;bb=1;cc=1;dd=1;ee=0;ff=1;gg=1;break;
}
*data=c3.dt;
*(data+10)=c4.dt;
}
//*****************************************************************************
//函数名称:void numbertochar(unsigned int value,unsigned char sel)
//输入参数:unsigned int value,unsigned char sel
//输出参数:void
//*****************************************************************************
void numbertochar(unsigned int value,unsigned char sel)
{
unsigned char i;
unsigned int q[4];
q[3]=value/1000;value=value%1000;
q[2]=value/100;value=value%100;
q[1]=value/10;value=value%10;
q[0]=value;
for(i=0;i<4;i++)
{
if(sel==0)
{recode(&Display_Buff[i],q[i]);}
if(sel==1)
{recode1(&Display_Buff[i+5],q[i]);}
}
Display_Buff[7]=Display_Buff[7]|1<<4;
}
//*****************************************************************************
//函数名称:
//输入参数:
//输出参数:
// The error routine that is called if the driver library encounters an error.
//*****************************************************************************
#ifdef DEBUG
void __error__(char *pcFilename, unsigned long ulLine)
{
}
#endif
//*****************************************************************************
//函数名称: 定时器0中断
//输入参数: 无
//输出参数: 无
//功能:定时器0中断
//*****************************************************************************
void Timer0IntHandler(void)
{
static unsigned char i;
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // Clear the timer interrupt.
if(++i>1)
{
i=0;
GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5,GPIO_PIN_5);
}
else
{
GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5,0);
}
}
//*****************************************************************************
//函数名称:void UARTIntHandler(void)
//输入参数:void
//输出参数:void
//功能:UART中断函数.
//*****************************************************************************
void UARTIntHandler(void)
{
static unsigned char i;
unsigned long ulStatus;
ulStatus = UARTIntStatus(UART0_BASE, true);//获取中断状态
UARTIntClear(UART0_BASE, ulStatus);//清楚中断标志
while(UARTCharsAvail(UART0_BASE))
{
D[i]=UARTCharGetNonBlocking(UART0_BASE);
//UARTCharPutNonBlocking(UART0_BASE, D[i]);
if(++i>5)
{
i=0;
}
}
if((D[0]==0x01)&&(D[1]==0x03))//设置占空比 0-100
{
PWMA=((unsigned int)D[2]<<8)|D[3];
PWMB=((unsigned int)D[4]<<8)|D[5];
if(PWMA==100)//限制
{PWMA=99;}
if(PWMB==100)//限制
{PWMB=99;}
}
PWMPulseWidthSet(PWM_BASE, PWM_OUT_0, ulPeriod * PWMA / 100);//PMWA=0~100
PWMPulseWidthSet(PWM_BASE, PWM_OUT_1, ulPeriod * PWMB / 100);
}
//*****************************************************************************
//函数名称:void UARTSend(const unsigned char *pucBuffer, unsigned long ulCount)
//输入参数:const unsigned char *pucBuffer, unsigned long ulCount
//输出参数:void
//功能:UART发送字符串.
//*****************************************************************************
void UARTSend(const unsigned char *pucBuffer, unsigned long ulCount)
{
while(ulCount--) //循环发送字符
{
UARTCharPutNonBlocking(UART0_BASE, *pucBuffer++);//写下个字符到UART
}
}
/******************************************************************************
//函数名称:void Init_ADC(void)
//输入参数:void
//输出参数:void
//功能:初始化ADC
*******************************************************************************/
void Init_ADC(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); //使能ADC时钟
//IntMasterEnable(); // 使能处理器中断
ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_PROCESSOR, 0);//
ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH0| ADC_CTL_IE);// ADC_CTL_CH0
ADCSequenceStepConfigure(ADC0_BASE, 0, 1, ADC_CTL_CH1| ADC_CTL_IE);// ADC_CTL_CH0
ADCSequenceStepConfigure(ADC0_BASE, 0, 2, ADC_CTL_TS| ADC_CTL_IE |ADC_CTL_END);// ADC_CTL_CH0
ADCSequenceEnable(ADC0_BASE, 0); // 使能采样序列3
ADCIntClear(ADC0_BASE, 0);
IntEnable(INT_ADC0); // 使能AD中断
ADCIntEnable(ADC_BASE, 0); // 使能AD中断模块
}
//*****************************************************************************
//函数名称:void ADC_Sequence_0_ISR(void)
//输入参数:void
//输出参数:void
//*****************************************************************************
void ADC_Sequence_0_ISR(void)
{
ADCIntClear(ADC0_BASE,0); /* 清除中断标志位 */
while(!(HWREG(ADC0_BASE + 0X04C) & 0X100)) {
ADCSequenceDataGet(ADC0_BASE, 0, &ulData); /* 读出10位转换结果 */
//ulData = ((ulData & 0x3ff) * 1000 * 3) / 1023;
Charge_Val[flag_Charge] = ulData;
flag_Charge++;
if( flag_Charge >= 3) {
flag_Charge = 0;
flag_ADC_finish = 1; /* A/D转换完成标志位 */
}
}
}
//*****************************************************************************
//函数名称:void jtagWait(void)
//输入参数:void
//输出参数:void
//*****************************************************************************
void jtagWait(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); // 使能KEY所在的GPIO端口
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE,GPIO_PIN_4); // 设置KEY所在管脚为输入
if (GPIOPinRead(GPIO_PORTC_BASE,GPIO_PIN_4) == 0x00) // 若复位时按下KEY,则进入
{
while(1); // 死循环,以等待JTAG连接
}
SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC); // 禁止KEY所在的GPIO端口
}
//*****************************************************************************
//函数名称:void Write_M5265(unsigned char data)
//输入参数:unsigned char data
//输出参数:void
//*****************************************************************************
void Write_M5265(unsigned char data)
{
unsigned char i;
for(i=0;i<8;i++)
{
CLR_LCD_CLK;
if((data&0x80)==0x80)
{SET_LCD_DATA;}
else
{CLR_LCD_DATA;}
SET_LCD_CLK;
data=data<<1;
}
}
//*****************************************************************************
//函数名称:void Display_LCD(void)
//输入参数:void
//输出参数:void
//*****************************************************************************
void Display_LCD(void)
{
unsigned char i=0;
CLR_LCD_LAH;
for(i=0;i<20;i++)
{
Write_M5265(Display_Buff[i]);
}
SET_LCD_LAH;
CLR_LCD_LAH;
}
#define T0
#define PWM
//*****************************************************************************
//函数名称:int main(void)
//输入参数:void
//输出参数:int
//*****************************************************************************
int main(void)
{
uc2ul data;
//************************初始化时钟及端口**********************************
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |SYSCTL_XTAL_6MHZ);//初始化主系统时钟,配置6MHz外部晶振作为主时钟
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB | SYSCTL_PERIPH_GPIOC | SYSCTL_PERIPH_GPIOD | SYSCTL_PERIPH_GPIOE);//启用 GPIO B、C、D 和 E
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);//配置PB0、PB1为输出
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_5 );//配置PC5为输出
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4 );//配置PC4为输入
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_0 | GPIO_PIN_1);//配置PD0、PD1为输出
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_0 | GPIO_PIN_1);//配置PE0、PE1为输出
//使能处理器总中断
IntMasterEnable();
#ifdef PWM
//************************初始化PWM****************************************
/*
PWM0->PD0 PWM1->PD1
PWM2->PB0 PWM3->PB1
PWM4->PE0 PWM5->PE1
*/
// PWM时钟配置:不分频
SysCtlPWMClockSet(SYSCTL_PWMDIV_1);
// 使能PWM模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);
// PD0和PD1配置为PWM功能
GPIOPinTypePWM(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//计算周期
ulPeriod = SysCtlClockGet() / 600; //6000000/300
// 配置PWM发生器1:加减计数
PWMGenConfigure(PWM_BASE, PWM_GEN_0,PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
//设置PWM发生器1的周期
PWMGenPeriodSet(PWM_BASE, PWM_GEN_0, ulPeriod);
//设置占空比
PWMPulseWidthSet(PWM_BASE, PWM_OUT_0, 0);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_1, 0);
// 使能PWM0和PWM1的输出
PWMOutputState(PWM_BASE, PWM_OUT_0_BIT | PWM_OUT_1_BIT, true);
// 使能PWM发生器0
PWMGenEnable(PWM_BASE, PWM_GEN_0);
#endif
//************************初始化UART0***************************************
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
//配置 GPIO-A0->RX,GPIO-A1->TX 为UART功能脚
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//配置 UART为 38,400, 8-N-1
UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 38400,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
//使能UART0中断
IntEnable(INT_UART0);
UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);
#ifdef T0
//************************初始化T0******************************************
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
// Configure the two 32-bit periodic timers.
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet());
//使能定时器中断
IntEnable(INT_TIMER0A);
//定时器超时中断
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
//使能定时器
TimerEnable(TIMER0_BASE, TIMER_A);
#endif
//************************初始化ADC*****************************************
Init_ADC();
UARTSend((unsigned char *)"1234567890", 12);
while(1)
{
ADCProcessorTrigger(ADC0_BASE,0);
if(flag_ADC_finish ==1)
{
flag_ADC_finish = 0;
UARTCharPutNonBlocking(UART0_BASE, 0x01);
UARTCharPutNonBlocking(UART0_BASE, 0x02);
data.uidata=Charge_Val[0];
UARTSend(&data.ucdata[0], 2);
data.uidata=Charge_Val[1];
UARTSend(&data.ucdata[0], 2);
data.uidata=Charge_Val[2];
UARTSend(&data.ucdata[0], 2);
}
//段码LCD显示功能
Charge_Val[1]=(Charge_Val[1]*2.4544921875);//电压系数根据实际修改
numbertochar(Charge_Val[1],1);
Charge_Val[0]=(Charge_Val[0]*0.01);//电压系数根据实际修改
numbertochar(Charge_Val[0],0);
Display_LCD();
SysCtlDelay(SysCtlClockGet()/2);
}
}
软件