本帖最后由 jinglixixi 于 2017-8-31 10:15 编辑
对于管道型的生产设备,为了保证其可靠的运行需要定时地进行清洗,其工作方式与我们常见的洗衣机十分相像,主要有2种工作参数,即运行时长和清洗模式。而清洗模式又关系到电机运行的速度、转动方向和工作节拍,其中的工作节拍是指转动时间与停止时间的占空比。利用本次活动的STM32 FOC开发套件,十分便于做这方面的模拟设计。 在设计的开始本打算是设计一个基于MCU内部RTC进行多时段控制的管道清洗控制器,且利用STM32F3-Discovery的程序实现了RTC计时功能,如图1和图2所示,但移植到该电机套件的环境下却不能正常执行。无奈只能放弃该功能。 图1 用F302实现LCD5110屏显示
图2 用F302实现RTC计时
随后以LCD5110液晶屏、软按键及电机套件构建了一个简单测试环境,如图3所示。在未启动电机的情况下,能进行模拟运行,即开机后可通过按键来设置电机运行的模式,为简化设计电机工作节拍内的运行时间t1和停止时间t2是由程序固定设置好的,工作时长n,也由程序来指定,其界面如图4所示。为便于验证,最后一行为运行状态指示行以供对比。 图3 验证环境构成
图4 设置运行模式
图5 模拟验证界面
其中LCD5110液晶屏与MCU的引脚连接关系如下: SCE --PB13 RST --PB14 DC --PB15 DIN --PB6 SCLK--PC7 LED+ --Vcc 软按键与与MCU的引脚连接关系如下: 1 -- PA14 2 -- PA15 3 -- NC 4 -- PA13 COM -- GND
故对LCD5110相关引脚所定义的输出高、低电平的语句如下: #define SetLCD_SCE_Low() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET)
#define SetLCD_RST_High() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET) #define SetLCD_RST_Low() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET)
#define SetLCD_DC_High() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET) #define SetLCD_DC_Low() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET)
#define SetLCD_SDIN_High() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET) #define SetLCD_SDIN_Low() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET)
#define SetLCD_SCLK_High() HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET) #define SetLCD_SCLK_Low() HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET)
LCD5110屏的初始化函数如下: - void LCD_Init(void)
- {
- SetLCD_RST_Low();
- delay_1us();
- SetLCD_RST_High();
- delay_1us();
- delay_1us();
- LCD_write_CMD(0x21);
- LCD_write_CMD(0xc0);
- LCD_write_CMD(0x06);
- LCD_write_CMD(0x13);
- LCD_write_CMD(0x20);
- LCD_Clear();
- LCD_write_CMD(0x0c);
- }
复制代码 实现设计功能的主程序如下: - int main(void)
- {
- uint n,i,j,k,m,v;
- HAL_Init();
- SystemClock_Config();
- MX_GPIO_Init();
- MX_ADC1_Init();
- MX_DAC_Init();
- GPIO_Configuration();
- LCD_Init();
- LCD_Clear();
- LCD_write_english_string(0,0,"NUCLEO-F302R8");
- LCD_write_english_string(0,2,"NUCLEO-IHM07M1");
- LCD_write_english_string(0,4,"X-CUBE-SPN7");
- HAL_Delay(1000);
- MX_TIM1_Init();
- MX_TIM6_Init();
- MX_TIM16_Init();
- MC_SixStep_INIT();
- loop:
- LCD_Clear();
- LCD_write_english_string(10,0,"M"); // 工作模式
- LCD_write_english_string(30,0,"t1"); // 启动时间
- LCD_write_english_string(50,0,"t2"); // 暂停时间
- LCD_write_english_string(70,0,"n"); // 运行时长
- n=0;
- i=1;
- v=3;
- while(i)
- { // 选取工作模式
- if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_14)==0) n=1;
- if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15)==0) n=2;
- if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_13)==0) n=4;
- LCD_set_XY(10,2);
- LCD_write_char(n+0x30);
- if(n>0) i=0;
- if(n==1)
- { // 设置模式参数
- j=3;
- k=2;
- MC_Set_Speed(4000); // 指定转速
- LCD_set_XY(30,2);
- LCD_write_char(j+0x30);
- LCD_set_XY(50,2);
- LCD_write_char(k+0x30);
- }
-
- if(n==2)
- {
- j=2;
- k=3;
- MC_Set_Speed(6000);
- LCD_set_XY(30,2);
- LCD_write_char(j+0x30);
- LCD_set_XY(50,2);
- LCD_write_char(k+0x30);
- }
- if(n==4)
- {
- j=3;
- k=3;
- MC_Set_Speed(10000);
- LCD_set_XY(30,2);
- LCD_write_char(j+0x30);
- LCD_set_XY(50,2);
- LCD_write_char(k+0x30);
- }
- }
- LCD_set_XY(70,2);
- LCD_write_char(v+0x31);
- LCD_set_XY(70,2);
- LCD_write_char(3+0x30);
- for(m=0;m<v;m++) // 运行时长控制
- {
- MC_StartMotor(); // 启动电机
- for(i=0;i<j;i++)
- {
- LCD_set_XY(30,4);
- LCD_write_char(i+0x31);
- HAL_Delay(1000); // 时间基准
- }
- MC_StopMotor(); // 电机暂停
- for(i=0;i<k;i++)
- {
- LCD_set_XY(50,4);
- LCD_write_char(i+0x31);
- HAL_Delay(1000);
- }
- LCD_set_XY(70,4);
- LCD_write_char(m+0x31);
- }
- goto loop;
复制代码小结: 经实际测试,可达到对应的控制要求。但其最大的缺陷是由于电机的工作电流较大且带有一定的电磁干扰,从而导致在电机运行时会破坏LCD5110屏的正常显示,而在电机启动前的工作模式选择是不受影响的,故不适于在连续操作的场合使用。
|
学习了