tag 标签: PWM驱动直流电机

相关博文
  • 热度 15
    2020-6-18 16:04
    4096 次阅读|
    1 个评论
    【富苪坤物联网开发板评测】FR8016H开发板采集红外对管电压及驱动直流电机
    首先感谢富苪坤微电子有限公司和面包板社区举办的这次活动,本人很荣幸申请到了这款开发板,下图是开发板的全貌: 一、首先介绍一下开发板上的资源配置: 1,32位高性能的MCU(ARM M3),集成低功耗蓝牙5.0,板载蓝牙天线 2、板载SH2100六轴陀螺仪传感器 3、板载温湿度传感器SHT30-DIS 4、预留气压计BMP280芯片焊盘 5、两个用户按键,一个复位按键 6、USB转TTL串口 7、240x240分辨率LCD彩色屏 8、接口:喇叭、五线步进电机、ESP8266WIFI接口、MQ-135空气质量传感器接口,MIC输入,Jlink调试 9、PWM输出,ADC输入,IIC, SPI, UART通信 二、开发板上电测试 1,安装串口驱动程序CP210xVCPInstaller_x64.exe 2、用配套的USB线连接开发板和电脑,在电脑设备管理器中找到串口号 3、打开串口烧录软件,选择演示文件V1.4.bin 4、通过按键K1和K2控制开发板的LCD屏幕显示的内容 其中,skip_count为六轴陀螺仪运动计数,SHT30为温湿度传感器,板子没有CAPB18芯片,所以显示error。 三,利用开发板测量红外对管电路电压和通过PWM驱动两路直流电机 1、开发环境,安装keil5软件和ARM.CMSIS.5.7.0的设备包 2、搭建工程系统,按照官方文档《Fr801xH如何构建系统pdf》中的教程创建工程,本人是在官方例程演示文件源码v1.4的基础上进行的开发,主要是修改SDK库文件的路径和配置Jlink。 3、红外对管电路制作,参考网上的教程,用红外发射管和红外接收管制作红外对管电路,电路原理图如下图所示 上图中,Tx为红外发射管,Rx为红外接收管,长脚为正极,短脚为负极,红外接收管短脚连接电源的正极,这点很重要,第一次焊接时弄反了引脚导致LED灯不亮。对红外对管进行测试,红外接收管接收红外发射管发射出来的红外线来控制三极管的导通和关闭,从而控制LED灯的亮灭,阳光中的红外线也会影响红外接收管的接收,红外接收管接收到的红外线越强,LED灯越亮。黑色的物体可以吸收红外线,将黑色的笔放在红外对管下方时,LED灯熄灭。测试结果如下图 4、在程序中配置三路10bit ADC,和两路PWM, ADC的结构体函数中主要是要修改channels数为三路ADC采样,PWM中配置PWM波频率和占空比 // pwm init system_set_port_pull(GPIO_PA1, true); system_set_port_mux(GPIO_PORT_A, GPIO_BIT_1, PORTA1_FUNC_PWM1); system_set_port_pull(GPIO_PC5, true); system_set_port_mux(GPIO_PORT_C, GPIO_BIT_5, PORTC5_FUNC_PWM5); pwm_init(PWM_CHANNEL_5, 200, 60); pwm_init(PWM_CHANNEL_1, 200, 60); //ADC init struct adc_cfg_t cfg; // uint16_t result; system_set_port_mux(GPIO_PORT_D, GPIO_BIT_4, PORTD4_FUNC_ADC0); system_set_port_mux(GPIO_PORT_D, GPIO_BIT_5, PORTD5_FUNC_ADC1); system_set_port_mux(GPIO_PORT_D, GPIO_BIT_6, PORTD6_FUNC_ADC2); memset((void*)&cfg, 0, sizeof(cfg)); cfg.src = ADC_TRANS_SOURCE_PAD; cfg.ref_sel = ADC_REFERENCE_AVDD; cfg.channels = 0x07; //三路ADC1,2,3 cfg.route.pad_to_sample = 1; cfg.clk_sel = ADC_SAMPLE_CLK_24M_DIV13; cfg.clk_div = 0x3f; adc_init(&cfg); adc_enable(NULL, NULL, 0); 用高占空比启动电机,然后降低pwm来降低电机速度 pwm_start(PWM_CHANNEL_1); pwm_start(PWM_CHANNEL_5); co_delay_100us(5000); //delay 0.5s pwm_update(PWM_CHANNEL_1, 200, 50); pwm_update(PWM_CHANNEL_5, 200, 50); 在simple_peripheral_init(void)函数中修改系统定时器函数的定时时间为0.1s,在定时器回调函数里读取三路ADC的值,ADC测量的是红外接收管长脚的电压值,接收到的红线光越强,电压值越大,根据三路ADC的值来控制两路电机的运动。将ADC接收到的值显示在LCD屏幕上。 void timer_refresh_fun(void *arg) { uint8_t LCD_ShowStringBuff ; //读取三路ADC的值 uint16_t result1, result2, result3; adc_get_result(ADC_TRANS_SOURCE_PAD, 0x01, &result1); sprintf((char*)LCD_ShowStringBuff,"adc0 volatge = %d ",result1); LCD_ShowString(20,50,LCD_ShowStringBuff,BLACK); adc_get_result(ADC_TRANS_SOURCE_PAD, 0x02, &result2); sprintf((char*)LCD_ShowStringBuff,"adc1 volatge = %d ",result2); LCD_ShowString(20,80,LCD_ShowStringBuff,BLACK); adc_get_result(ADC_TRANS_SOURCE_PAD, 0x04, &result3); sprintf((char*)LCD_ShowStringBuff,"adc2 volatge = %d ",result3); LCD_ShowString(20,110,LCD_ShowStringBuff,BLACK); //控制电机转向 if((result2 = 440)) { //直行 pwm_update(PWM_CHANNEL_1, 200, 50); pwm_update(PWM_CHANNEL_5, 200, 50); } if(result1 =440 ) { //大幅度左转 pwm_update(PWM_CHANNEL_1, 200, 28); pwm_update(PWM_CHANNEL_5, 200, 50); } if(result3 400) { //大幅度右转 pwm_update(PWM_CHANNEL_5, 200, 28); pwm_update(PWM_CHANNEL_1, 200, 50); } 400 && result1 = 440) { //小幅度左转 pwm_update(PWM_CHANNEL_1, 200, 35); pwm_update(PWM_CHANNEL_5, 200, 50); } 400 && result3 = 440) { //小幅度右转 pwm_update(PWM_CHANNEL_5, 200, 35); pwm_update(PWM_CHANNEL_1, 200, 50); } } 下图为ADC测量得到的三路电压值 根据三路红外对管的测量电压值可以制作红外避障小车和红外循迹小车,下图为小车实物图 在测试循迹小车中发现光线对红外对管的测量结果有一定的影响,需要在接收管和发射管之间用黑色的物体隔开,让接收管尽量只接收地面反射回来的红外光,控制电机的转向时,ADC测量出的值与门限值进行比较,这个门限值需要根据时间的场景进行多次测量选取,比较麻烦。 总结,FR8016H开发板的资源丰富,接口较多,其板载的蓝牙功能适合与手机通信,做物联网开发,官方提供的sdk库降低了开发难度,接下来将深入了解开发板的蓝牙通信功能。