📄 main.c
字号:
/***********************************************************************************************************
金陵科技学院2008年毕业设计-----智能小车控制系统
开发平台:EasyARM615
开发环境:IAR
***********************************************************************************************************/
#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_types.h"
#include "hw_adc.h"
#include "debug.h"
#include "gpio.h"
#include "sysctl.h"
#include "adc.h"
#include "PLLSet.h"
#include "hw_gpio.h"
#include "hw_pwm.h"
#include "pwm.h"
#include "hw_nvic.h"
#include "interrupt.h"
#include "sysctl.h"
#define LED2 GPIO_PIN_5 //定义LED2
#define LED3 GPIO_PIN_6 //定义LED2
#define LED1 GPIO_PIN_7 // 定义LED1的引脚
#define KEY1 GPIO_PIN_4 // 定义KEY1的引脚
LADC()
{
ADCSequenceDisable(ADC_BASE,0); // 禁能所有采样序列
// 禁能所有采样序列
ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 0); // 采样序列1为处理器触发
// 采样序列0的第0步使用ADC0,完成第0步后结束
ADCSequenceStepConfigure(ADC_BASE,0, 0, ADC_CTL_CH0 | ADC_CTL_END);
ADCSequenceEnable(ADC_BASE,0); // 使能采样序列0
}
RADC()
{
ADCSequenceDisable(ADC_BASE,1);
ADCSequenceConfigure(ADC_BASE, 1, ADC_TRIGGER_PROCESSOR, 0); // 采样序列0为处理器触发
// 采样序列1的第0步使用ADC0,完成第0步后结束
ADCSequenceStepConfigure(ADC_BASE,1, 0, ADC_CTL_CH1 | ADC_CTL_END);
ADCSequenceEnable(ADC_BASE, 1); // 使能采样序列
}
int main(void)
{ SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); // 使能GPIOD模块
GPIODirModeSet(GPIO_PORTD_BASE, LED1, GPIO_DIR_MODE_OUT); // 配置LED1为输出
GPIODirModeSet(GPIO_PORTD_BASE, KEY1, GPIO_DIR_MODE_IN); // 配置KEY1为输入
while(1)
{
if(GPIOPinRead(GPIO_PORTD_BASE,KEY1)==0)
{ // 使LED状态改变
GPIOPinWrite(GPIO_PORTD_BASE, LED1, LED1^GPIOPinRead(GPIO_PORTD_BASE,LED1));
unsigned long LData=0, RData=0;
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ); // 设定晶振为时钟源
PLLSet();
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
GPIODirModeSet(GPIO_PORTC_BASE, LED2, GPIO_DIR_MODE_OUT);
GPIODirModeSet(GPIO_PORTC_BASE, LED3, GPIO_DIR_MODE_OUT);
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC); // 使能ADC模块的时钟
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); // 125KSps采样率
/* ADCSequenceDisable(ADC_BASE,0); // 禁能所有采样序列
// 禁能所有采样序列
ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 0); // 采样序列1为处理器触发
// 采样序列0的第0步使用ADC0,完成第0步后结束
ADCSequenceStepConfigure(ADC_BASE,0, 0, ADC_CTL_CH0 | ADC_CTL_END);
ADCSequenceEnable(ADC_BASE,0); // 使能采样序列1
ADCSequenceDisable(ADC_BASE,1);
ADCSequenceConfigure(ADC_BASE, 1, ADC_TRIGGER_PROCESSOR, 0); // 采样序列0为处理器触发
// 采样序列1的第0步使用ADC0,完成第0步后结束
ADCSequenceStepConfigure(ADC_BASE,1, 1, ADC_CTL_CH1 | ADC_CTL_END);
ADCSequenceEnable(ADC_BASE, 1); // 使能采样序列1*/
SysCtlPWMClockSet(SYSCTL_PWMDIV_1); // PWM时钟源1分频
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); // 使能PD口外设
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); //使能PE口外设
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM); // 使能PWM外设
GPIOPinTypePWM(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1); // 设置PD0,PD1为PWM0和PWM1
GPIOPinTypePWM(GPIO_PORTE_BASE, GPIO_PIN_0 | GPIO_PIN_1); // 设置PE0,PE1为PWM3和PWM4
PWMGenConfigure(PWM_BASE, PWM_GEN_2,PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenConfigure(PWM_BASE, PWM_GEN_0,PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
// 设置PWM发生器0为上下计数方式,两路PWM不同步
while(1)
{ LADC();
ADCProcessorTrigger(ADC_BASE, 0); // 处理器触发采样序列1
while( (HWREG(ADC_BASE + ADC_O_X_SSFSTAT) & 0x00000100) ); // 等待FIFO 0为非空,即等待转换结束
ADCSequenceDataGet(ADC_BASE, 0, &LData); // 读出10位转换结果
LData = (LData*1000* 3) /1024; // 换算成真实电压值,单位mV
RADC();
ADCProcessorTrigger(ADC_BASE, 1); // 处理器触发采样序列0
while( (HWREG(ADC_BASE + ADC_O_X_SSFSTAT) & 0x00000100) ); // 等待FIFO 0为非空,即等待转换结束
ADCSequenceDataGet(ADC_BASE,1, &RData); // 读出10位转换结果
RData = (RData*1000* 3) /1024; // 换算成真实电压值,单位mV
if((LData < 400) && (RData > 600) ) //左拐
{
GPIOPinWrite(GPIO_PORTC_BASE, LED2,~LED2);
GPIOPinWrite(GPIO_PORTC_BASE, LED3,LED3);
PWMOutputState(PWM_BASE,PWM_OUT_4_BIT | PWM_OUT_5_BIT, false);
PWMGenPeriodSet(PWM_BASE, PWM_GEN_0, 80000);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_0, 70000);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_1, 0);
PWMOutputState(PWM_BASE, PWM_OUT_0_BIT | PWM_OUT_1_BIT , true); // 使能PWM0
PWMGenEnable(PWM_BASE, PWM_GEN_0);
/* PWMGenPeriodSet(PWM_BASE, PWM_GEN_2,80000); // 设置两路PWM的共同周期
PWMPulseWidthSet(PWM_BASE, PWM_OUT_4,0);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_5,0);
PWMOutputState(PWM_BASE,PWM_OUT_4_BIT | PWM_OUT_5_BIT, true); // 使能PWM4\5
PWMGenEnable(PWM_BASE, PWM_GEN_2); // 使能PWM发生器2 */
}
if((LData > 500) && (RData < 400)) //右拐
{
GPIOPinWrite(GPIO_PORTC_BASE, LED2,LED2);
GPIOPinWrite(GPIO_PORTC_BASE, LED3,~LED3);
PWMOutputState(PWM_BASE, PWM_OUT_0_BIT | PWM_OUT_1_BIT , false);
/* PWMGenPeriodSet(PWM_BASE, PWM_GEN_0, 80000);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_0, 0);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_1, 0);
PWMOutputState(PWM_BASE, PWM_OUT_0_BIT | PWM_OUT_1_BIT, true); // 使能PWM0
PWMGenEnable(PWM_BASE, PWM_GEN_0); */
PWMGenPeriodSet(PWM_BASE, PWM_GEN_2, 80000); // 设置两路PWM的共同周期
PWMPulseWidthSet(PWM_BASE, PWM_OUT_4, 0);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_5, 70000);
PWMOutputState(PWM_BASE, PWM_OUT_4_BIT | PWM_OUT_5_BIT, true); // 使能PWM4\5
PWMGenEnable(PWM_BASE, PWM_GEN_2); // 使能PWM发生器2
}
if( (LData > 500) && (RData > 800)) //前进
{
GPIOPinWrite(GPIO_PORTC_BASE, LED2,~LED2);
GPIOPinWrite(GPIO_PORTC_BASE, LED3,~LED3);
PWMGenPeriodSet(PWM_BASE, PWM_GEN_2, 80000); // 设置两路PWM的共同周期
PWMPulseWidthSet(PWM_BASE, PWM_OUT_4,0);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_5,10000);
PWMOutputState(PWM_BASE,PWM_OUT_4_BIT | PWM_OUT_5_BIT, true); // 使能PWM4\5
PWMGenEnable(PWM_BASE, PWM_GEN_2); // 使能PWM发生器2
PWMGenPeriodSet(PWM_BASE, PWM_GEN_0, 80000);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_0, 10000);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_1, 0);
PWMOutputState(PWM_BASE, PWM_OUT_0_BIT | PWM_OUT_1_BIT, true); // 使能PWM0
PWMGenEnable(PWM_BASE, PWM_GEN_0);
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -