void motor_rev() {
unsigned char i; unsigned int j;
for (j=0; j<1; j++) //转1×n圈 {
//退出此循环程序
for (i=0; i<8; i++) //一个周期转45度 {
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4| GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 , REV[i]);
// P1 = REV[i]; //取数据
SysCtlDelay(1 * (TheSysClock / 3000)); } } }
void motor_ffw1() {
unsigned char i; unsigned int j;
for (j=0; j<1; j++) //转1*n圈 {
for (i=0; i<8; i++) //一个周期转45度 {
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4| GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7, FFW[i]);
// P1 = FFW[i]; //取数据 SysCtlDelay(1 * (TheSysClock / 3000)); } } }
void motor_rev1() {
unsigned char i; unsigned int j;
for (j=0; j<1; j++) //转1×n圈 {
//退出此循环程序
for (i=0; i<8; i++) //一个周期转45度 {
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4| GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 , REV[i]);
// P1 = REV[i]; //取数据
SysCtlDelay(1 * (TheSysClock / 3000)); } } }
// ADC初始化 void adcInit(void) {
SysCtlPeriEnable(SYSCTL_PERIPH_GPIOB); SysCtlPeriEnable(SYSCTL_PERIPH_GPIOE); GPIOPinTypeOut(GPIO_PORTE_BASE,GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_3);
GPIOPinTypeOut(GPIO_PORTB_BASE,GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_3);
SysCtlPeriEnable(KEY_PERIPH); GPIOPinTypeIn(KEY_PORT, KEY_PIN);
SysCtlPeriEnable(SYSCTL_PERIPH_ADC); // 使能ADC模块 SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); // 设置ADC采样率 ADCSequDisable(ADC_BASE, 0); // 配置前先禁止采样序列
// 采样序列配置:ADC基址,采样序列编号,触发事件,采样优先级 ADCSequConfig(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 0);
// ADC采样序列步进配置:ADC基址,采样序列0,步值,采样通道
ADCSequStepConfig(ADC_BASE, 0, 0, ADC_CTL_CH0); // 第0步:采样ADC0 ADCSequStepConfig(ADC_BASE, 0, 1, ADC_CTL_CH1); // 第1步:采样ADC1 ADCSequStepConfig(ADC_BASE, 0, 2, ADC_CTL_CH2); // 第2步:采样ADC2 ADCSequStepConfig(ADC_BASE, 0, 3, ADC_CTL_CH3); // 第3步:采样ADC3
ADC_CTL_END | // 结束,并 ADC_CTL_IE); // 申请中断
ADCIntEnable(ADC_BASE, 0); // 使能ADC中断 IntEnable(INT_ADC0); // 使能ADC采样序列中断 IntMasterEnable(); // 使能处理器中断
ADCSequEnable(ADC_BASE, 0); // 使能采样序列 }
// ADC采样:*pulVal保存采样结果 void adcSample(unsigned long *pulVal) {
ADCProcessorTrigger(ADC_BASE, 0); // 处理器触发采样序列 while (!ADC_EndFlag); // 等待采样结束
ADC_EndFlag = false; // 清除ADC采样结束标志 ADCSequDataGet(ADC_BASE, 0, pulVal); // 自动读取全部ADC结果 }
int main(void) {
unsigned char r,N=64; //N 步进电机运转圈数 unsigned long ulVal[8],v[8];
int left,right,up,down,limit360l=0,limit180u=0,limit360r=0,limit180d=0; char s[40]; unsigned long i;
jtagWait(); // 防止JTAG失效,重要! clockInit(); // 时钟初始化:PLL,20MHz uartInit(); // UART初始化 adcInit(); // ADC初始化
for (;;) {
adcSample(ulVal); // ADC采样
for (i = 0; i < 8; i++) {
v[i] = (ulVal[i] * 3) / 1024; // 转换成电压值
sprintf(s, \ // 采样值格式化为电压值 uartPuts(s); // 通过UART输出电压值 }
if( ((v[1]+v[2])-(v[0]+v[3])) > 3 ) left = 1; else left = 0;
if( ((v[0]+v[3])-(v[2]+v[1])) > 3 ) right = 1; else right = 0;
if( ((v[2]+v[3])-(v[1]+v[0])) > 3 ) up = 1; else up = 0;
if( ((v[1]+v[0])-(v[2]+v[3])) > 3) down = 1; else down = 0;
SysCtlDelay(15 * (TheSysClock / 3000)); // 延时约1500ms if (GPIOPinRead(KEY_PORT, KEY_PIN) == 0x00) // 如果按下KEY {
// GPIOPinWrite(LED_PORT, LED_PIN, 0x00); // 点亮LED for(r=0;r motor_ffw(); //电机正转 } } if (right == 1 )//&& limit360r < 181) // 如果按下KEY { // GPIOPinWrite(LED_PORT, LED_PIN, 0x00); // 点亮LED for(r=0;r motor_ffw(); //电机正转 } right = 0; limit360r += 45; limit360l -= 45; } if (left == 1 )//&& limit360l < 181) // 如果按下KEY { // GPIOPinWrite(LED_PORT, LED_PIN, 0x00); // 点亮LED for(r=0;r motor_rev(); //电机正转 } left = 0; limit360r -= 45; limit360l += 45; } if (up == 1 )//&& limit180u < 91) // 如果按下KEY { // GPIOPinWrite(LED_PORT, LED_PIN, 0x00); // 点亮LED for(r=0;r motor_rev1(); //电机正转 } up = 0; limit180u += 45; limit180d -= 45; } if (down == 1 )//&& limit180d < 91) // 如果按下KEY { // GPIOPinWrite(LED_PORT, LED_PIN, 0x00); // 点亮LED for(r=0;r motor_ffw1(); //电机正转 } down = 0; limit180u -= 45; limit180d += 45; }