飞思卡尔使用例程
本帖最后由 李维强-15级 于 2017-2-26 14:37 编辑例程全部基于超核库函数,直接调用
按键扫描 4*4
开启PWM例程
外部中断,配合编码器使用 本帖最后由 李维强-15级 于 2017-2-22 02:58 编辑
按键扫描
4*4键盘 没有任何外接的那种键盘
h头文件
#ifndef __MATRIX_KEY_H
#define __MATRIX_KEY_H
#include "common.h"
//默认配置到E口0-7脚,如需要自己修改
#define MatrixPin1_10x0u
#define MatrixPin1_20x2u
#define MatrixPin1_30x4u
#define MatrixPin1_40x6u
#define MatrixPin2_10x1u
#define MatrixPin2_20x3u
#define MatrixPin2_30x5u
#define MatrixPin2_40x7u
void matrix_key_init(void);//初始化矩阵键盘
void Matrix_key_Init_1(void);
void Matrix_key_Init_2(void);
uint8_t MatrixKeyScan(void); //扫描
#endif
}
.C源文件
#include "MatrixKey.h"
#include "common.h"
#include "gpio.h"
/*
author@李维强
适合周老师发的黑色开发板,4*4键盘,E0,E2,E4,E6端口接一排,E1,E3,E5,E7端口接一排
该代码看起简单,但是有大量重复调用流程,追求效率的同学慎用!!!
*/
void matrix_key_init(void)
{
GPIO_QuickInit(HW_GPIOE,MatrixPin1_1,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_2,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_3,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_4,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_1,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_2,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_3,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_4,kGPIO_Mode_IPD);
}
void Matrix_key_Init_1(void)
{
GPIO_QuickInit(HW_GPIOE,MatrixPin1_1,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_2,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_3,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_4,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_1,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_2,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_3,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_4,kGPIO_Mode_IPD);
}
void Matrix_key_Init_2(void)
{
GPIO_QuickInit(HW_GPIOE,MatrixPin2_1,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_2,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_3,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_4,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_1,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_2,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_3,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_4,kGPIO_Mode_IPD);
}
uint8_t MatrixKeyScan(void)
{
uint8_t key=0;
Matrix_key_Init_1();
DelayUs(1);
PEout(MatrixPin1_1)=1;PEout(MatrixPin1_2)=1;PEout(MatrixPin1_3)=1;PEout(MatrixPin1_4)=1;
DelayUs(1);
if(PEin(MatrixPin2_1)==1 || PEin(MatrixPin2_2)==1 || PEin(MatrixPin2_3)==1 || PEin(MatrixPin2_4)==1)
{
DelayMs(10);
if(PEin(MatrixPin2_1)==1){key=1;}
else if(PEin(MatrixPin2_2)==1){key=2;}
else if(PEin(MatrixPin2_3)==1){key=3;}
else if(PEin(MatrixPin2_4)==1){key=4;}
Matrix_key_Init_2();
DelayMs(10);
PEout(MatrixPin2_1)=1;PEout(MatrixPin2_2)=1;PEout(MatrixPin2_3)=1;PEout(MatrixPin2_4)=1;
DelayUs(1);
if(PEin(MatrixPin1_1)==1){key+=0;}
else if(PEin(MatrixPin1_2)==1){key+=4;}
else if(PEin(MatrixPin1_3)==1){key+=8;}
else if(PEin(MatrixPin1_4)==1){key+=12;}
else{key=0;}
}
return key;
}
调用流程
包含头文件后在主循环里面调用:
temp_key=MatrixKeyScan();
然后temp_key这个变量就会有你按下的那个按键的值(1-16之间),如果都没按下 temp_key为0。 本帖最后由 李维强-15级 于 2017-2-25 21:55 编辑
按键设置为按下再弹起后,再去做按键的操作,保证按一次响应一次
初始化PWM直接调用下面这一句话即可。
FTM_PWM_QuickInit(FTM0_CH0_PC01, kPWM_EdgeAligned, 1000);
其中 FTM0_CH0_PC01代表使用FTM0定时器,且开启CH0通道,对应端口为PC01,kPWM_EdgeAligned表示使用边沿触发,1000表示频率为1000Hz
改变占空比用下面这一句话
FTM_PWM_ChangeDuty(HW_FTM0, HW_FTM_CH0, 0);
/* 第三个参数取值0-10000,对应占空比 0-100% ,第二个参数HW_FTM_CH0表示通道改变通道0的占空比,第一个参数HW_FTM0表示对FTM0定时器进行设置*/
注意 我知己封装了个函数 在主函数下面
//表示
void PWMEnable(uint32_t MAP,FunctionalState STATE)
{
static FTM_Type * const FTM_InstanceTable[] = FTM_BASES;
map_t * pq = (map_t*)&(MAP);
if(STATE==DISABLE)
{
FTM_InstanceTable->CONTROLS.CnSC &=0xF3;
}
else
{
FTM_InstanceTable->CONTROLS.CnSC &=~(FTM_CnSC_ELSB_MASK|FTM_CnSC_ELSA_MASK);
FTM_InstanceTable->CONTROLS.CnSC |=FTM_CnSC_ELSB_MASK;
}
}
// PWMEnable(FTM0_CH0_PC01,ENABLE);//开启FTM0的PWM通道0
// PWMEnable(FTM0_CH0_PC01,DISABLE);//关闭FTM0的PWM通道0
下面这个视频视直接截取的电机引脚上的
http://v.cqutbbs.cn/upload/video/20170225/QQ%E7%9F%AD%E8%A7%86%E9%A2%9120170225214539.mp4
本帖最后由 李维强-15级 于 2017-2-26 14:45 编辑
外部中断例程,适应这次周老师买的编码器
最先我以为周老师买的正交编码器,结果实物的编码器就是3根线的一圈500线的编码器,VCC,GND,和一个数据线。所以这个编码器是无从判断方向的,现实已经如此,那么就不能用FTM0内部的正交编码器来判断电机转速了。
所以,直接用外部中断来记录脉冲个数,简单好理解,保证也是准确的。
先说个大概概念,就是K60单片机内部GPIO都可以做中断输入,只有做相应配置即可。我这里就随便拿了个PA25口做中断输入
只需做2步操作,就可以使用中断了,如下图
步骤1:
步骤2:
下面是源代码下载
另外,编码器是5-12V的电压,而单片机是3.3V,所以需要做个转换电路,为配合有些同学要控制2路的转速,我直接做个可以转换2路,直接输出3.3V的板子,届时大家直接抄板即可
另外,PWM板子用实验室的9630,通过实验证明发热太严重,因为9630内阻打了3A电流理论耗散功率有2.4W了,实际更高烫死了。已经改方案,全部采用内阻3m欧的N-MOS,搭H桥实现,届时大家来参考我这个即可。
顶一个 电机驱动原理图以及PCB图以设计好,测试可用,大家可以下载学习使用。
以下为工程附件,下载即可。
页:
[1]