本文最后更新于 3221 天前,其中的信息可能已经有所发展或是发生改变。
本程序使用山外库: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_电机驱动
谢谢分享,
站内有完整源码