2005国赛题F407编程思路:
1.实现功能:
a.实现坐标的设定
b.实现设定定点之后可以到达该点
c.设定圆心坐标以及半径后可以实现画圆
d.物体当前坐标实时显示在LCD上
e.能够沿着黑线进行跑动
2.编程初步思路:
a.设定两个变量:Set_X,Set_Y.分别由按键KEY0与KRY1实现。
KEY0: 短按 Set_X+1 长按 Set_X连加
KEY1: 短按 Set_Y+1 长按 Set_Y连加
确定键:KEY2 短按确定
启动键:KEY2 长按启动
分为三种模式:
#1:到达定点模式
#2:画圆模式
#3:循迹模式
三种模式的切换键由KEY_UP来决定,初始界面即为到达定点模式,切换键的状态定义为一个变量:CHANGE_MODE
Switch(CHANGE_MODE)
Case 0: 显示到定点模式
Case 1: 显示画圆模式
Case 2: 显示循迹模式
If(CHANGE_MODE==3) CHANGE_MODE=0;
KEY_UP按下一次,CHANGE_MODE++;
按键用到的IO口:
PA0 | WK_UP | Y | 1,按键KEY_UP | 只要KEY_UP不按下,该IO完全独立 |
PE2 | KEY2 | Y | 接按键KEY2 | 只要KEY2不按下,该IO完全独立 |
PE3 | KEY1 | Y | 接按键KEY1 | 只要KEY1不按下,该IO完全独立 |
PE4 | KEY0 | Y | 接按键KEY0 | 只要KEY0不按下,该IO完全独立 |
按键检测用到的定时器;定时器7
按键检测初始化函数:void KEYscan_init(void);
里面包含了一个定时器初始化。
设定的数值需要用TFTLCD显示,除了LCD初始化函数之外,设定显示函数为void LCD_Display(void);
得把这个模块添加进去程序。
TFTLCD用到的IO口:
PB0 | T_SCK | Y |
PB1 | T_PEN | Y |
PB2 | BOOT1 | N |
PB15 | LCD_BL | Y |
PC13 | T_CS | Y |
PD0 | FSMC_D2 | N |
PD1 | FSMC_D3 | N |
PD2 | SDIO_CMD | N |
PD3 | ETH_RESET | N |
PD4 | FSMC_NOE | N |
PD5 | FSMC_NWE | N |
PD6 | DCMI_SCL | Y |
PD7 | DCMI_SDA | Y |
PD8 | FSMC_D13 | N |
PD9 | FSMC_D14 | N |
PD10 | FSMC_D15 | N |
PD11 | FSMC_A16 | N |
PD12 | FSMC_A17 | N |
PD13 | FSMC_A18 | N |
PD14 | FSMC_D0 | N |
PD15 | FSMC_D1 | N |
PE7 | FSMC_D4 | N |
PE8 | FSMC_D5 | N |
PE9 | FSMC_D6 | N |
PE10 | FSMC_D7 | N |
PE11 | FSMC_D8 | N |
PE12 | FSMC_D9 | N |
PE13 | FSMC_D10 | N |
PE14 | FSMC_D11 | N |
PE15 | FSMC_D12 | N |
PF11 | T_MOSI | Y |
TFTLCD显示需要用到的定时器:定时器7
b.将物体置于原点位置,让它能够先向上或者向下,然后向左还是向右进行移动,理想情况下到达定点后,便用超声波的测量值与它进行比对,这个时候就直接利用与实际位置到滑轮的距离以及目标点到滑轮的距离来进行调整,进行反馈控制。
首先便要驱动电机,使得电机能够正转,反转,停止。分别用以下的函数来实现:
Void MOTOR_zhengzhuan(void);
Void MOTOR_fanzhuan(void);
Void MOTOR_stop(void);
控制两个步进电机需要八路PWM输出,全部集成到MOTOR.c中去输出,
定时器的初始化也放入其中,需要用到两个定时器。
用到的两个定时器:TIM3 TIM4
用到的八个IO口:
PC6 | TIM3_CH1 | TIM8_CH1 |
PC7 | TIM3_CH2 | TIM8_CH2 |
PC8 | TIM3_CH3 | TIM8_CH3 |
PC9 | MCO2 | TIM3_CH4 |
PC6 | TIM3_CH1 | TIM8_CH1 |
PC7 | TIM3_CH2 | TIM8_CH2 |
PC8 | TIM3_CH3 | TIM8_CH3 |
PC9 | MCO2 | TIM3_CH4 |
在刚开始走直线到达目标点的时候,从原点出发,应该是不需要用到当前坐标点的数值:extern u8: CURRENT_X,CURRENT_Y;
两个都应该设置为全局变量。
在控制两个电机的时候,一个步进单位,它的一个脚步为1.8度,线所绕动的距离为 float MOTOR_bujin=0.028cm
出发点物体坐标与左边滑轮之间的距离为DISTANCE_CLEFT
出发点物体坐标与右边滑轮之间的距离为DICTANCE_CRIGHT
设定坐标点与左边滑轮之间的距离为DISTANCE_SLEFT
设定坐标点与右边滑轮之间的距离为DISTANCE_SRIGHT
单位全部记为CM
设定一个变量为CHAZHI_LEFT=DISTANCE_SLEFT-DISTANCE_CLEFT
设定一个变量为CHAZHI_RIGHT=DISTANCE_SRIGHT-DICTANCE_CRIGHT
CHAZHI_LEFT除以0.028,即为左边电机收到的节拍数目。
CHAZHI_RIGHT除以0.028,即为右边点击收到的节拍数目。
然后将这些节拍分配给两个电机,达到相应的节拍后,停止,重复相同的操作,直到分配给两个电机的节拍再次用光。
每次给予两边的节拍用完后,用超声波来进行误差判断,当误差达到2CM以内后,停止。
超声波模块的设置:
CURRENT_X=左侧超声波得到的数值减去??
CURRENT_Y=下方超声波得到的数值减去??
c.画圆
通过键盘输入它的圆心坐标数值,(SET_Xyuan,SET_Yyuan)
通过计算出n_yuan个已知坐标点,用b的方案一个个的进行画圆。
其中用到四个坐标点会用到超声波来让它这四个点的精度提升。
可以设置一个变量:为画圆时候的基本角度,将360除以n_yuan便是等于它了,利用画圆公式:
第一个坐标点:()
下一个坐标点:()
画一个点,n_yuan--,等于0时候,便画完了。