STM32F103红外遥控步进电机
本案例通过融合正点原子的红外遥控实验和步进电机实验,实现红外遥控控制步进电机进行转动
1.在红外遥控实验代码中,将步进电机控制代码driver.c和driver.h移植到HRDWARE中。
2.移植步进电机实验的USMART文件及代码到红外遥控实验代码中,因为步进电机控制使用到usmart中的一些时钟。
3.在主函数中引用"usmart.h" "driver.h",并初始化相关定义
int main(void)
{
u8 key;
u8 t=0;
u8 *str=0;
//移植过来的代码
u8 i;
u8 keyval;
//delay_init(); //延时函数初始化
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
//uart_init(115200); //串口初始化为115200
usmart_dev.init(72); //初始化USMART
LED_Init(); //LED端口初始化
KEY_Init(); //初始化按键
Driver_Init(); //驱动器初始化
//BEEP_Init(); //初始化蜂鸣器端口
BEEP=0;
//***
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
LCD_Init();
KEY_Init();
Remote_Init(); //红外接收初始化
BEEP_Init(); //初始化蜂鸣器端口
4.在遥控器按键扫描函数中添加电机控制代码,频率,脉冲,转向,即可在按下遥控器后控制电机转动,可以添加LED、beep等便于确认指令是否执行。
switch(key)
{
case 0:str="ERROR";break;
case 162:str="POWER";break;
case 98:str="UP";break;
case 2:str="PLAY";break;
case 226:str="ALIENTEK";break;
case 194:str="RIGHT";break;
case 34:str="LEFT";break;
case 224:str="VOL-";break;
case 168:str="DOWN";break;
case 144:str="VOL+";break;
case 104:str="1";LED0=!LED0;break;
//LED1=!LED1;break;
case 152:str="2";BEEP=!BEEP;break;
case 176:str="3";break;
case 48:str="4";break;
case 24:str="5";break;
case 122:str="6";break;
case 16:str="7";break;
case 56:str="8";Locate_Rle(4000,500,CCW);LED1=!LED1;break; //按下遥控8,以500Hz的频率 逆时针发400脉冲
case 90:str="9";Locate_Rle(2000,500,CW);LED0=!LED0;break;//按下遥控9,以500Hz的频率 顺时针发200脉冲
case 66:str="0";LED1=!LED1;Locate_Abs(0,500);BEEP=!BEEP;break;//按下遥控0,回零点
case 82:str="DELETE";break;
}
5.编译查看运行结果
编译可能存在一处错误,两个函数对时钟有重复定义,注释掉其中一个即可(好像是remote.c和usmart.c)
注释后出现以下问题,则是KEIL未破解成功导致
..\OBJ\REMOTE.axf: error: L6047U: The size of this image (39396 bytes) exceeds the maximum allowed for this version of the linker
破解成功即可解决
6.实验效果
1)按下遥控8,以500Hz的频率 逆时针发400脉冲,LED1按一次亮灯,再按一次灭灯
2)按下遥控9,以500Hz的频率 顺时针发200脉冲,LED0按一次亮灯,再按一次灭灯
3)按下遥控0,回零点,LED1按一次亮灯,再按一次灭灯,蜂鸣器按一次响,再按一次不响
注:学习笔记,仅用于学习交流,转载请标注原文链接,如有帮助,点赞收藏关注,谢谢