重工电子论坛

标题: 飞思卡尔使用例程 [打印本页]

作者: 李维强-15级    时间: 2017-2-21 23:18
标题: 飞思卡尔使用例程
本帖最后由 李维强-15级 于 2017-2-26 14:37 编辑

例程全部基于超核库函数,直接调用
按键扫描 4*4
开启PWM例程
外部中断,配合编码器使用
作者: 李维强-15级    时间: 2017-2-21 23:29
本帖最后由 李维强-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)=1Eout(MatrixPin1_2)=1Eout(MatrixPin1_3)=1Eout(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)=1Eout(MatrixPin2_2)=1Eout(MatrixPin2_3)=1Eout(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。
作者: 李维强-15级    时间: 2017-2-25 21:54
本帖最后由 李维强-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)

作者: 李维强-15级    时间: 2017-2-26 14:35
本帖最后由 李维强-15级 于 2017-2-26 14:45 编辑

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

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

只需做2步操作,就可以使用中断了,如下图
步骤1:

步骤2:

下面是源代码下载
Freescale.rar (2.26 MB, 下载次数: 21)


另外,编码器是5-12V的电压,而单片机是3.3V,所以需要做个转换电路,为配合有些同学要控制2路的转速,我直接做个可以转换2路,直接输出3.3V的板子,届时大家直接抄板即可
另外,PWM板子用实验室的9630,通过实验证明发热太严重,因为9630内阻打了3A电流理论耗散功率有2.4W了,实际更高烫死了。已经改方案,全部采用内阻3m欧的N-MOS,搭H桥实现,届时大家来参考我这个即可。

作者: 鲁亮    时间: 2017-2-28 12:44
顶一个
作者: 刘洋电子刘洋    时间: 2017-3-4 19:21
电机驱动原理图以及PCB图以设计好,测试可用,大家可以下载学习使用。


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




欢迎光临 重工电子论坛 (http://cqutlab.cn/) Powered by Discuz! X3.1