本帖最后由 jinglixixi 于 2017-10-12 09:14 编辑
在上一篇已构建起了平衡小车的供电体系,这次的任务则是让车轮先转起来,从而为后续设计提供可靠的基础,此次实验的电路构成如图1所示。主要任务是通过K2和K3来控制一路电机的正反转,并以LED0和LED2来指示正反转的状态。 图1实验电路构成
此外,可通过K0和K1键的引脚来引入电机编码器的计数脉冲,从而来验证脉冲输出引脚C1和C2的单周脉冲数,为转速检测提供依据。 单侧电机控制的实验效果如图2所示,其控制信号是由P0.12和P0.14来输出,经驱动模块的OUT3和OUT4来控制电机的转动及方向。 图2 单侧电机控制效果
至此,证明电机的控制体系是有效的,后续会对相关的传感器进行功能检测以便进行姿态的控制和调整。待机械结构组装后,即可进行整体的功能调试与验证。
与之相关的程序如下: #define BOARD_LED_GPIO_PORT BOARD_LED_RED_GPIO_PORT #define BOARD_LED_GPIO_PIN BOARD_LED_RED_GPIO_PIN
#define KEY_GPIO_CFG IOCON_MODE_PULLUP | IOCON_FUNC0 | IOCON_GPIO_MODE | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF #define KEY_NUM 4
const uint8_t KEY_GPIO_PORT[KEY_NUM] = { 1, 1, 1, 1 }; const uint8_t KEY_GPIO_PIN [KEY_NUM] = { 8, 9, 10, 11 };
//按键初始化函数 - void key_init(void)
- {
- CLOCK_EnableClock(kCLOCK_Gpio1);
- GPIO_PinInit(GPIO, 1, 8, kGPIO_DigitalInput);
- GPIO_PinInit(GPIO, 1, 9, kGPIO_DigitalInput);
- GPIO_PinInit(GPIO, 1, 10, kGPIO_DigitalInput);
- GPIO_PinInit(GPIO, 1, 11, kGPIO_DigitalInput);
- }
复制代码//电机控制与指示初始化函数 - void modor_init(void)
- {
- CLOCK_EnableClock(kCLOCK_Gpio0);
- gpio_pin_config_t moder_config = { kGPIO_DigitalOutput, 0,};
- GPIO_PinInit(GPIO, 0, 12, &moder_config);
- GPIO_PinInit(GPIO, 0, 14, &moder_config);
- GPIO_PinInit(GPIO, 0, 15, &moder_config);
- GPIO_PinInit(GPIO, 0, 21, &moder_config);
-
- GPIO_WritePinOutput(GPIO, 0U, 12U, 0);
- GPIO_WritePinOutput(GPIO, 0U, 14U, 0);
- GPIO_WritePinOutput(GPIO, 0U, 15U, 0);
- GPIO_WritePinOutput(GPIO, 0U, 21U, 0);
- }
复制代码//读取键值函数 - uint8_t key_value(uint8_t num)
- {
- return GPIO_ReadPinInput(GPIO, KEY_GPIO_PORT[num], KEY_GPIO_PIN[num]);
- }
复制代码//测试主函数 - int main(void)
- {
- int n;
- /* Init board hardware. */
- /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
- CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
- BOARD_InitPins();
- BOARD_BootClockHSRUN();
- BOARD_InitDebugConsole();
-
- SystemCoreClockUpdate();
- SysTick_Config(SystemCoreClock/1000);
-
- modor_init();
- key_init();
- OLED_Init(); // OLED 屏初始化
- OLED_Clear();
- OLED_ShowString(0,6,"num:",16); // 脉冲计数检测
- OLED_ShowNum(48,6,n,3,16);
- while(1)
- { //引入脉冲计数功能
- if(key_value(0) == 0)
- {
- while(key_value(0)==0);
- n++; //左转
- }
- if(key_value(1) == 0)
- {
- while(key_value(1)==0);
- n--; //右转
- }
-
复制代码 就目前情况看,板上资源对GPIO口的占用是较严重的,要想兼顾OLED屏显示、转速脉冲检测、电机控制、无线通讯、超声波测距及6轴传感器检测等GPIO口资源是难以满足要求的,只能在分步调试时使用一些器件,待完成验证后再去除以省出GPIO口。似乎让LPC54114开发板在平衡小车中充当控制板有些欠妥,它的板载资源被埋没了,又影响了平衡小车对其资源的要求。目前看只能在模拟口上再做做文章了!
|