重工电子论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 5614|回复: 5

飞思卡尔使用例程

[复制链接]

286

主题

666

帖子

5538

积分

学生管理组

Rank: 8Rank: 8

积分
5538
发表于 2017-2-21 23:18:23 | 显示全部楼层 |阅读模式
本帖最后由 李维强-15级 于 2017-2-26 14:37 编辑

例程全部基于超核库函数,直接调用
按键扫描 4*4
开启PWM例程
外部中断,配合编码器使用
回复

使用道具 举报

286

主题

666

帖子

5538

积分

学生管理组

Rank: 8Rank: 8

积分
5538
 楼主| 发表于 2017-2-21 23:29:56 | 显示全部楼层
本帖最后由 李维强-15级 于 2017-2-22 02:58 编辑

按键扫描
4*4键盘 没有任何外接的那种键盘

h头文件
[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
#ifndef __MATRIX_KEY_H
#define __MATRIX_KEY_H		
#include "common.h"	 

//默认配置到E口0-7脚,如需要自己修改
#define MatrixPin1_1  0x0u
#define MatrixPin1_2  0x2u
#define MatrixPin1_3  0x4u
#define MatrixPin1_4  0x6u
#define MatrixPin2_1  0x1u
#define MatrixPin2_2  0x3u
#define MatrixPin2_3  0x5u
#define MatrixPin2_4  0x7u

void matrix_key_init(void);//初始化矩阵键盘
void Matrix_key_Init_1(void);		
void Matrix_key_Init_2(void);
uint8_t MatrixKeyScan(void);	//扫描

#endif
}


.C源文件
[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
#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;
}




调用流程
包含头文件后在主循环里面调用:

  1. temp_key=MatrixKeyScan();
复制代码

然后temp_key这个变量就会有你按下的那个按键的值(1-16之间),如果都没按下 temp_key为0。
回复 支持 反对

使用道具 举报

286

主题

666

帖子

5538

积分

学生管理组

Rank: 8Rank: 8

积分
5538
 楼主| 发表于 2017-2-25 21:54:29 | 显示全部楼层
本帖最后由 李维强-15级 于 2017-2-25 21:55 编辑

按键设置为按下再弹起后,再去做按键的操作,保证按一次响应一次
初始化PWM直接调用下面这一句话即可。

  1. FTM_PWM_QuickInit(FTM0_CH0_PC01, kPWM_EdgeAligned, 1000);
复制代码

其中    FTM0_CH0_PC01代表使用FTM0定时器,且开启CH0通道,对应端口为PC01,kPWM_EdgeAligned表示使用边沿触发,1000表示频率为1000Hz

改变占空比用下面这一句话

  1. FTM_PWM_ChangeDuty(HW_FTM0, HW_FTM_CH0, 0);
  2. /* 第三个参数取值0-10000,对应占空比 0-100% ,第二个参数HW_FTM_CH0表示通道改变通道0的占空比,第一个参数HW_FTM0表示对FTM0定时器进行设置*/
复制代码


注意 我知己封装了个函数 在主函数下面

  1. //表示
  2. void PWMEnable(uint32_t MAP,FunctionalState STATE)
  3. {
  4.     static FTM_Type * const FTM_InstanceTable[] = FTM_BASES;
  5.     map_t * pq = (map_t*)&(MAP);               
  6.     if(STATE==DISABLE)
  7.     {
  8.         FTM_InstanceTable[pq->ip]->CONTROLS[pq->chl].CnSC &=0xF3;      
  9.     }
  10.     else
  11.     {
  12.         FTM_InstanceTable[pq->ip]->CONTROLS[pq->chl].CnSC &=~(FTM_CnSC_ELSB_MASK|FTM_CnSC_ELSA_MASK);
  13.         FTM_InstanceTable[pq->ip]->CONTROLS[pq->chl].CnSC |=FTM_CnSC_ELSB_MASK;
  14.     }

  15. }


  16. //                    PWMEnable(FTM0_CH0_PC01,ENABLE);  //开启FTM0的PWM通道0
  17. //                    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

开两路PWM并且按键控制占空比.rar (2.26 MB, 下载次数: 1)
回复 支持 反对

使用道具 举报

286

主题

666

帖子

5538

积分

学生管理组

Rank: 8Rank: 8

积分
5538
 楼主| 发表于 2017-2-26 14:35:22 | 显示全部楼层
本帖最后由 李维强-15级 于 2017-2-26 14:45 编辑

外部中断例程,适应这次周老师买的编码器

最先我以为周老师买的正交编码器,结果实物的编码器就是3根线的一圈500线的编码器,VCC,GND,和一个数据线。所以这个编码器是无从判断方向的,现实已经如此,那么就不能用FTM0内部的正交编码器来判断电机转速了。
所以,直接用外部中断来记录脉冲个数,简单好理解,保证也是准确的。
先说个大概概念,就是K60单片机内部GPIO都可以做中断输入,只有做相应配置即可。我这里就随便拿了个PA25口做中断输入

只需做2步操作,就可以使用中断了,如下图
步骤1:
1.jpg
步骤2:
2.jpg
下面是源代码下载
Freescale.rar (2.26 MB, 下载次数: 21)
回复 支持 反对

使用道具 举报

14

主题

69

帖子

485

积分

学生管理组

Rank: 8Rank: 8

积分
485
QQ
发表于 2017-2-28 12:44:31 | 显示全部楼层
顶一个
回复

使用道具 举报

0

主题

1

帖子

84

积分

学生管理组

Rank: 8Rank: 8

积分
84
发表于 2017-3-4 19:21:30 | 显示全部楼层
电机驱动原理图以及PCB图以设计好,测试可用,大家可以下载学习使用。
电机驱动.png

以下为工程附件,下载即可。
电机驱动.zip (2.89 MB, 下载次数: 11)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|cqutlab ( 渝ICP备15004556号

GMT+8, 2024-3-29 21:55 , Processed in 0.190227 second(s), 32 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表