K60笔记-读取编码器数值(正交解码)

本程序使用山外库:http://git.oschina.net/chenxuuu/vcan-K60-V5.3

正交解码获取

先初始化:

    ftm_quad_init(FTM1);                                    //FTM1 正交解码初始化

获取编码器值:

int16 val;
val = ftm_quad_get(FTM1);          //获取FTM1 正交解码 的脉冲数(负数表示反方向)

清空计数器:

ftm_quad_clean(FTM1);

可以将获取函数封装成如下样式:

/*!
 *  @brief      编码器数值获取函数
 *  @since      v1.1
 *  @note       输入值范围1,2   整型
 *  Sample usage:            encoder=encoder_get(1);    //获取编码器数值,赋给encoder
 */
int16 encoder_get(int encoderselect)
{
    int16 val;
    if(encoderselect==1)
    {
        val = ftm_quad_get(FTM1);          //获取FTM1 正交解码 的脉冲数(负数表示反方向)
        ftm_quad_clean(FTM1);
    }
    else if(encoderselect==2)
    {
        val = ftm_quad_get(FTM2);          //获取FTM2 正交解码 的脉冲数(负数表示反方向)
        ftm_quad_clean(FTM2);
    }
    return val;
}

本文所用到的工程文件:http://git.oschina.net/chenxuuu/K60-test/tree/master/正交解码

K60笔记-模拟舵机控制

本程序使用山外库:http://git.oschina.net/chenxuuu/vcan-K60-V5.3

模拟舵机通过电压大小控制方向(好像是这样w)

所以和电机差不多

先初始化PWM口

ftm_pwm_init(S3010_FTM, S3010_CH,S3010_HZ,100);

然后和控制电机一样

ftm_pwm_duty(S3010_FTM, S3010_CH,1000);

和之前一样,可以把这个封装成函数

#define control_actuator_center 1380
#define control_actuator_min 1260
#define control_actuator_max 1500     //自测
/*!
 *  @brief      舵机输出函数
 *  @since      v1.1
 *  @note       输入值范围-1~1   浮点型
 *  Sample usage:            control_actuator(-0.2);    //输出舵机反向0.2
 */
void control_actuator(float Voltage)
{
    if(Voltage>1)
        Voltage=1;
    else if(Voltage<-1)
        Voltage=-1;

    if(Voltage<0)
    {
        ftm_pwm_duty(S3010_FTM, S3010_CH,(int)((control_actuator_center-control_actuator_min)*Voltage+control_actuator_center));
    }else
    {
        ftm_pwm_duty(S3010_FTM, S3010_CH,(int)((control_actuator_max-control_actuator_center)*Voltage+control_actuator_center));
    }
}

调用栗子

if(key_check(KEY_U) == KEY_DOWN)
{
    dj+=0.01;
    control_actuator(dj);
}
if(key_check(KEY_D) == KEY_DOWN)
{
    dj-=0.01;
    control_actuator(dj);
}

本文所用工程文件:http://git.oschina.net/chenxuuu/K60-test/tree/master/舵机

K60笔记-PWM控制电机

本程序使用山外库:http://git.oschina.net/chenxuuu/vcan-K60-V5.3

首先初始化

    ftm_pwm_init(FTM0, FTM_CH2,10*1000,0);
    //初始化 FTM PWM ,使用 FTM0_CH3,频率为10k ,占空比为 100 / FTM0_PRECISON
    ftm_pwm_init(FTM0, FTM_CH3,10*1000,0);
    ftm_pwm_init(FTM0, FTM_CH4,10*1000,0);
    ftm_pwm_init(FTM0, FTM_CH5,10*1000,0);

PWM驱动

    ftm_pwm_duty(FTM0, FTM_CH6, 10);
    //设置 FTM0_CH6 占空比为 10/FTM0_PRECISON

示例:

/*!
 *     COPYRIGHT NOTICE
 *     Copyright (c) 2013,山外科技
 *     All rights reserved.
 *     技术讨论:山外论坛 http://www.vcan123.com
 *
 *     除注明出处外,以下所有内容版权均属山外科技所有,未经允许,不得用于商业用途,
 *     修改内容时必须保留山外科技的版权声明。
 *
 * @file       main.c
 * @brief      山外K60 平台主程序
 * @author     山外科技
 * @version    v5.2
 * @date       2014-11-03
 */

#include "common.h"
#include "include.h"

/*!
 *  @brief      main函数
 *  @since      v5.2
 *  @note       FTM PWM 电机驱动测试
 */
void main(void)
{
    uint8 i = 0;
    printf("\n*****FTM PWM 电机测试*****\n");

    ftm_pwm_init(FTM0, FTM_CH3,10*1000,80);         //初始化 FTM PWM ,使用 FTM0_CH3,频率为10k ,占空比为 100 / FTM0_PRECISON
                                                    // FTM0_PRECISON 配置 为 100 ,即占空比 为 100%
                                                    // port_cfg.h 里 配置 FTM0_CH3 对应为 PTA6
    gpio_init(PTD15,GPO,0);                         // 使能端 输入为 0

    //山外的电机驱动模块,经过 MOS 管 反相隔离。
    //K60 输出 PWM 为 100% ,实际接入 电机驱动就是 0%
    //K60 输出 使能端 为 低电平,实际接入 电机驱动 使能端就是 高电平

    while(1)
    {
        for(i= 0;i<=100;i+=10)
        {
            ftm_pwm_duty(FTM0,FTM_CH3,i);       //改变 占空比 ,K60 输出 PWM 占空比 逐渐增大,电机逐渐 降速
            DELAY_MS(500);
        }
    }
}

然而感觉这样子好麻烦诶qwq

所以翻出了原来的一个函数

/************电机输出函数*************/
void SetMotorVoltage(float fLeftVoltage,float fRightVoltage)
{
    int nOut;
    if(fLeftVoltage>0)
    {
	ftm_pwm_duty(FTM0,FTM_CH2,0);//左轮正向运动PWM占空比为0
	nOut=(int)(fLeftVoltage*PERIOD);//
	if(nOut>1000)
	{
		nOut=1000;
	}
	ftm_pwm_duty(FTM0,FTM_CH3,nOut);//左轮反向运动PWM占空比为nOut
    }                                                   //左电机正转
    else
    {
	ftm_pwm_duty(FTM0,FTM_CH3,0);//左轮反向运动PWM占空比为0
	fLeftVoltage=-fLeftVoltage;
	nOut=(int)(fLeftVoltage*PERIOD);
	if(nOut>1000)
	{
		nOut=1000;
	}
	ftm_pwm_duty(FTM0,FTM_CH2,nOut);//左轮正向运动PWM占空比为nOut
    }                                                    //左电机反转

    if(fRightVoltage>0)
    {
	ftm_pwm_duty(FTM0,FTM_CH4,0);//右轮正向运动PWM占空比为0
	nOut=(int)(fRightVoltage*PERIOD);
	if(nOut>1000)
	{
		nOut=1000;
	}
	ftm_pwm_duty(FTM0,FTM_CH5,nOut);//右轮反向运动PWM占空比为nOut
    }                                                     //右电机正转
    else
    {
	ftm_pwm_duty(FTM0,FTM_CH5,0);//右轮反向运动PWM占空比为0
	fRightVoltage=-fRightVoltage;
	nOut=(int)(fRightVoltage*PERIOD);
	if(nOut>1000)
	{
		nOut=1000;
	}
	ftm_pwm_duty(FTM0,FTM_CH4,nOut);//右轮正向运动PWM占空比为nOut
    }                                                     //右电机反转
}

这个函数可以直接让电机转

调用时可以这样:

SetMotorVoltage(x,y);
//正值正转,负值反转,xy均为float类型

示例

/*!
 *     COPYRIGHT NOTICE
 *     Copyright (c) 2013,山外科技
 *     All rights reserved.
 *     技术讨论:山外论坛 http://www.vcan123.com
 *
 *     除注明出处外,以下所有内容版权均属山外科技所有,未经允许,不得用于商业用途,
 *     修改内容时必须保留山外科技的版权声明。
 *
 * @file       main.c
 * @brief      山外K60 平台主程序
 * @author     山外科技
 * @version    v5.2
 * @date       2014-11-03
 */

#include "common.h"
#include "include.h"
#include "MK60_adc.h"
#include  "OLED.h"
#define	PERIOD				100				//电压转换PWM比例    待定

/************电机输出函数*************/
void SetMotorVoltage(float fLeftVoltage,float fRightVoltage)
{
    int nOut;
    if(fLeftVoltage>0)
    {
	ftm_pwm_duty(FTM0,FTM_CH2,0);//左轮正向运动PWM占空比为0
	nOut=(int)(fLeftVoltage*PERIOD);//
	if(nOut>1000)
	{
		nOut=1000;
	}
	ftm_pwm_duty(FTM0,FTM_CH3,nOut);//左轮反向运动PWM占空比为nOut
    }                                                   //左电机正转
    else
    {
	ftm_pwm_duty(FTM0,FTM_CH3,0);//左轮反向运动PWM占空比为0
	fLeftVoltage=-fLeftVoltage;
	nOut=(int)(fLeftVoltage*PERIOD);
	if(nOut>1000)
	{
		nOut=1000;
	}
	ftm_pwm_duty(FTM0,FTM_CH2,nOut);//左轮正向运动PWM占空比为nOut
    }                                                    //左电机反转

    if(fRightVoltage>0)
    {
	ftm_pwm_duty(FTM0,FTM_CH4,0);//右轮正向运动PWM占空比为0
	nOut=(int)(fRightVoltage*PERIOD);
	if(nOut>1000)
	{
		nOut=1000;
	}
	ftm_pwm_duty(FTM0,FTM_CH5,nOut);//右轮反向运动PWM占空比为nOut
    }                                                     //右电机正转
    else
    {
	ftm_pwm_duty(FTM0,FTM_CH5,0);//右轮反向运动PWM占空比为0
	fRightVoltage=-fRightVoltage;
	nOut=(int)(fRightVoltage*PERIOD);
	if(nOut>1000)
	{
		nOut=1000;
	}
	ftm_pwm_duty(FTM0,FTM_CH4,nOut);//右轮正向运动PWM占空比为nOut
    }                                                     //右电机反转
}

/*!
 *  @brief      main函数
 *  @since      v5.2
 *  @note       FTM PWM 电机驱动测试
 */
void main(void)
{
    float pwmc=0;
    printf("\n*****FTM PWM 电机测试*****\n");

    ftm_pwm_init(FTM0, FTM_CH2,10*1000,0);         //初始化 FTM PWM ,使用 FTM0_CH3,频率为10k ,占空比为 100 / FTM0_PRECISON
    ftm_pwm_init(FTM0, FTM_CH3,10*1000,0);
    ftm_pwm_init(FTM0, FTM_CH4,10*1000,0);
    ftm_pwm_init(FTM0, FTM_CH5,10*1000,0);
                                                    // FTM0_PRECISON 配置 为 100 ,即占空比 为 100%
                                                    // port_cfg.h 里 配置 FTM0_CH3 对应为 PTA6
//    gpio_init(PTD15,GPO,0);                         // 使能端 输入为 0
    //山外的电机驱动模块,经过 MOS 管 反相隔离。
    //K60 输出 PWM 为 100% ,实际接入 电机驱动就是 0%
    //K60 输出 使能端 为 低电平,实际接入 电机驱动 使能端就是 高电平

    while(1)
    {
        for(pwmc=0;pwmc<1;pwmc+=0.1)
        {
          SetMotorVoltage(pwmc,pwmc);
          led (LED1,LED_ON);
          lptmr_delay_ms(1000);
          led (LED1,LED_OFF);
          lptmr_delay_ms(100);
        }
        for(pwmc=0;pwmc>-1;pwmc-=0.1)
        {
          SetMotorVoltage(pwmc,pwmc);
          led (LED1,LED_ON);
          lptmr_delay_ms(1000);
          led (LED1,LED_OFF);
          lptmr_delay_ms(100);
        }
    }
}

本文的工程文件:http://git.oschina.net/chenxuuu/K60-test/tree/master/FTM_PWM_电机驱动

K60笔记-OLED显示

本程序使用山外库:http://git.oschina.net/chenxuuu/vcan-K60-V5.3

OLED使用12864屏幕,SPI串口

必要文件:oled.coled.h

引脚定义:

  #define OLED_SCL  PTA15_OUT
  #define OLED_SDA  PTA17_OUT
  #define OLED_RST  PTA19_OUT
  #define OLED_DC   PTA16_OUT
  #define OLED_CS   PTA14_OUT
/*
4线SPI使用说明:
VBT 供内部DC-DC电压,3.3~4.3V,如果使用5V电压,为保险起见串一个100~500欧的电阻
VCC 供内部逻辑电压 1.8~6V
GND 地

BS0 低电平
BS1 低电平
BS2 低电平

CS  片选管脚
DC  命令数据选择管脚
RES 模块复位管脚
D0(SCLK) ,时钟脚,由MCU控制
D1(MOSI) ,主输出从输入数据脚,由MCU控制

D2 悬空
D3-D7 , 低电平 , 也可悬空,但最好设为低电平
RD  低电平 ,也可悬空,但最好设为低电平
RW  低电平 ,也可悬空,但最好设为低电平
RD  低电平 ,也可悬空,但最好设为低电平
*/

显示中文测试:

#include "common.h"
#include "include.h"
#include "oled.h"
uint8 testbmp[]={};//省略

void main()
{
  OLED_Init();
    while(1)
    {
       OLED_Print(0,0,"双车追不上-启动中");
       Draw_BMP(50,3,77,6,testbmp);
       while(1)
       {
       OLED_P6x8Str(10,7,"loading.  ");
       DELAY_MS(500);
       OLED_P6x8Str(10,7,"loading..  ");
       DELAY_MS(500);
       OLED_P6x8Str(10,7,"loading...");
       DELAY_MS(500);
       OLED_P6x8Str(10,7,"loading   ");
       DELAY_MS(500);
       }
    }
}

效果如下:

显示图片测试:

#include "common.h"
#include "include.h"
#include "oled.h"
uint8 bmp1[]={};//省略
uint8 bmp2[]={};//省略
uint8 bmp3[]={};//省略
uint8 bmp4[]={};//省略
void main()
{
  OLED_Init();
    while(1)
    {
       Draw_BMP(0,0,73,6,bmp1);
       DELAY_MS(500);
       Draw_BMP(0,0,73,6,bmp3);
       DELAY_MS(500);
       Draw_BMP(0,0,73,6,bmp1);
       DELAY_MS(500);
       Draw_BMP(0,0,73,6,bmp2);
       DELAY_MS(500);
       Draw_BMP(0,0,73,6,bmp1);
       DELAY_MS(500);
       Draw_BMP(0,0,73,6,bmp3);
       DELAY_MS(500);
       Draw_BMP(0,0,73,6,bmp2);
       DELAY_MS(500);
       Draw_BMP(0,0,73,6,bmp1);
       DELAY_MS(500);
       Draw_BMP(0,0,73,6,bmp4);
       DELAY_MS(500);
       Draw_BMP(0,0,73,6,bmp1);
       DELAY_MS(500);
    }
}

效果如下:

测试代码:http://git.oschina.net/chenxuuu/K60-test/tree/master/OLED