《周易·乾》:“九五,飞龙在天,利见大人。”孔颖达疏:“谓有圣德之人得居王位。” 王弼注曰:不行不跃,而在乎天,非飞而何?故曰:“飞龙”也。如鱼归大海,自由驰骋,一说为表示左右逢源。
这回我们写点撒呢,任何一个事物,要想对其有所了解,是件很容易的事情,要对其有深入的理解则不易,比如投简历找工作,说对N多技能有了解,那和对某种技能精通,含金量是不同的,面试官关心的不是简历上的了解的技能,关心的是精通的技能,精通到什么程度,因为企业需要你去独当一面,不管能挡多大面积,是需要独立地解决一些问题的。
经过一个多月的摸索,对FireBLE已经比较熟悉,有了一定程度的认识,要想对其信手拈来滴玩耍,那是不可能的,一方面这是很多IT人集体智慧的产物,一个人不可能在短时间内全面地认识,这些天来我们用到的软件、资料、方法等也都是IT人和非IT人集体的智慧。牛顿曾说,如果他比别人看得远一点,那是因为他站在了巨人的肩膀上。况我等乎!另一方面,FireBLE提供了很多功能,在某一特定应用场景下的很多功能(换句话说,不可能把它当板砖去打坏银),这些功能需要在实际项目中灵活运用,或裁剪,或联合其他软硬件用,FireBLE的功能是有限的,FireBLE的用法却是无限的。
好了,不多扯了,今天需要借助一下外设来完成帖子,上图,
这是之前买的车一台,是用51玩耍的,今天换用fireBLE做大脑,
板子右侧已经把管脚都留出来了,这是极好的,把小车上的stc89c52rc撬下来,换上firebBLE, 小车是用两节锂电串联供电,车上有5v接口,两个车轮用六根线控制,可以正反转,今天只玩小车的右轮, 从车上引出5v 和GND,接到fireBLE的 5.0V 和GND上,注意不要插错洞,3.3V和5.0V的挨着呢,我不知道把5V的给3V插上是啥后果,有兴趣的童鞋可以一试,我没钱,不像有人还专门买了Applewatch,用两块钕磁铁砸碎之,还有烧程序时要关了车上的电,我也没测过外接5V电给电脑的u***口通上是啥后果。
下边的步骤,就是实现用五向开关控制右轮的转速,和转向,这回要抄下前边的程序,在余音绕梁中,实现了五向开关控制五个音调,这回就抄它,五个音调是用pwm来实现的,同样,放在电机上就可以调节转速,控制电机的有ABC三根线,A=高电平 B=低电平 是正转,反之反转,C高电平电机转,低电平不转, pwm控制C的供电,就可以调节转速,切换AB的高低电平就可以控制正反转,思路已经很清晰了,fireBLE上蜂鸣器用的是P26口,也就是pwm_ch1,把C接到p_26上,P06和P07分别接A、B,
简单改下程序,
编译烧写后,拔掉u***线,接上车载电,就可以用五向开关控制车轮转速转速转向,同时蜂鸣器也在名叫,因为直接从p26口接出来,相当于轮子和蜂鸣器公用一个pwm.
下面再改进下,把小车的左轮也加进去,fireBLE留出来的GPIO口还有不少,由原理图上可知P27连了pwm_ch0,再利用P10 和P11,同样pwm_ch0接左轮C线,p10 p11接A B线,五向开关重新定义下,上表示加速,下表示减速,左表示左轮反转,右表示右轮反转,按下表示启动/停止的切换, 代码如下,
- #include "system.h"
- #include "adc.h"
- #include "timer.h"
- #include "pwm.h"
- #include "analog.h"
- #include "uart.h"
- #include "stdio.h"
- //pwm周期
- int period = 1900;
- int d,r,m,f,s;//音调 已经注释
- int pwmd = 200;//转速调节
- float pwmc = 0.6;
- char flag = 0,flag2,//加减速状态标志
- flagrun = 0;//启动停止状态
- volatile uint32_t adc_done = 0;//adc读取完成标志
- int16_t buf[10];
- //pwm配置
- void pwm_io_config(void)
- {
- syscon_SetPMCR1(QN_SYSCON,P26_PWM1_PIN_CTRL
- |P27_PWM0_PIN_CTRL
- );
- }
- //adc读取完成调用
- static void adc_test_cb(void)
- {
- adc_done = 1;
- }
- void gpio_callback(enum gpio_pin pin)
- {
- // Read configuration
- adc_read_configuration read_cfg;
- read_cfg.trig_src = ADC_TRIG_SOFT;
- // modify here
- read_cfg.mode = BURST_MOD;
- read_cfg.start_ch = AIN0;
- read_cfg.end_ch = AIN0;
- adc_read(&read_cfg, buf, 10, adc_test_cb);//采样十次取平均值
- }
- void adc_io_config(void)
- {
- // pin mux
- syscon_SetPMCR0(QN_SYSCON, P00_UART0_TXD_PIN_CTRL
- | P05_ADCT_PIN_CTRL
- | P06_SW_DAT_PIN_CTRL
- | P07_SW_CLK_PIN_CTRL
- | P17_UART0_RXD_PIN_CTRL
- | P10_GPIO_8_PIN_CTRL
- | P11_GPIO_9_PIN_CTRL
- );
- syscon_SetPMCR1(QN_SYSCON, P26_PWM1_PIN_CTRL
- |P27_PWM0_PIN_CTRL
- | P30_AIN0_PIN_CTRL
- );
- }
void gpio_i()
- {
- if(flag ==0)
- {
- flag = 1;
- gpio_pull_set(GPIO_P07,GPIO_PULL_UP);
- gpio_pull_set(GPIO_P06,GPIO_PULL_DOWN);
- }
- else
- {
- flag = 0;
- gpio_pull_set(GPIO_P06,GPIO_PULL_UP);
- gpio_pull_set(GPIO_P07,GPIO_PULL_DOWN);
- }
- }
- void gpio_j()
- {
- if(flag2 ==0)
- {
- flag2 = 1;
- gpio_write_pin_field(GPIO_P11,(uint32_t)GPIO_HIGH);
- gpio_write_pin_field(GPIO_P10,(uint32_t)GPIO_LOW);
- }
- else
- {
- flag2 = 0;
- gpio_write_pin_field(GPIO_P10,(uint32_t)GPIO_HIGH);
- gpio_write_pin_field(GPIO_P11,(uint32_t)GPIO_LOW);
- }
- }
- int main (void)
- {
- SystemInit();//系统初始化
- adc_io_config();//配置ADC
- //adc初始化
- adc_init(ADC_SINGLE_WITHOUT_BUF_DRV, ADC_CLK_1000000, ADC_INT_REF, ADC_12BIT);
- //串口打印信息
- uart_init(QN_UART0, __USART_CLK, UART_115200);
- uart_tx_enable(QN_UART0, MASK_ENABLE);//uartʹÄÜ
- //pwm配置
- pwm_io_config();
- //初始化PWM
- pwm_init(PWM_CH1);
- pwm_init(PWM_CH0);
- //设置pwm周期和占空比
- pwm_config(PWM_CH1,119,PWM_COUNT_US(period,119),PWM_COUNT_US(1000,119));
- pwm_config(PWM_CH0, PWM_PSCAL_DIV, PWM_COUNT_US(1000, PWM_PSCAL_DIV), PWM_COUNT_US(1000*0.6, PWM_PSCAL_DIV));
- //启用PWM
- pwm_enable(PWM_CH1,MASK_ENABLE);
- pwm_enable(PWM_CH0 ,MASK_ENABLE);
- //启用pwm时钟
- pwm_clock_on();
- adc_done = 0;
- //GPIO设置
- gpio_init(gpio_callback);
- //p27 p10 p11设置
- gpio_set_direction_field(GPIO_P27,(uint32_t)GPIO_OUTPUT);
- gpio_set_direction_field(GPIO_P10|GPIO_P11,(uint32_t)GPIO_OUTPUT);
- //下降沿触发中断
- gpio_set_interrupt(GPIO_P12,GPIO_INT_FALLING_EDGE);
- //开中断
- gpio_enable_interrupt(GPIO_P12);
- gpio_clock_on();//开GPIO时钟
- gpio_i();
- gpio_j();
- period = d;
- while (1)
- {
- if(adc_done == 1)//adc读取完毕
- {
- int sum = 0;
- for (int i = 0; i < 10; i++)
- {
- sum += buf[i];//累加取样
- }
- int avg = sum / 10;//平均值
//串口输出adc值和电压值
- printf("ADC Val:%dt Voltage:%d(mV)rn", avg, ADC_RESULT_mV(avg));
- if(avg >430 && avg<450)//上 加速
{
- printf("uprn");
- if(pwmd ==100)//除数不能为0
- {
- pwmd=100;
- }
- else
- {
- pwmd -=100;
- }
- }
- else if(avg >1276 && avg<1296)//下 减速
- {
- printf("downrn");
- pwmd +=100;
- }
- else if(avg>1720 && avg<1740)//左 左轮反转
- {
- printf("leftrn");
- gpio_i();
- }
- else if(avg >865 && avg<885)//右 右轮反转
- {
- printf("rightrn");
- gpio_j();
- }
- else if(avg >2037 && avg<2057)//按下 启动停止
- {
- printf("pushrn");
- if(flagrun==0)
- {
- flagrun =1;
- pwm_enable(PWM_CH0,MASK_DISABLE);
- pwm_enable(PWM_CH1,MASK_DISABLE);
- }
- else
- {
- flagrun=0;
- pwm_enable(PWM_CH0,MASK_ENABLE);
- pwm_enable(PWM_CH1,MASK_ENABLE);
- }
- }
- period = 1000000/pwmd;//速度计算
- //两个pwm分别控制左右轮,可以改进代码,分别控制转速
- pwm_config(PWM_CH1, PWM_PSCAL_DIV, PWM_COUNT_US(period, PWM_PSCAL_DIV), PWM_COUNT_US(period*pwmc, PWM_PSCAL_DIV));
- pwm_config(PWM_CH0, PWM_PSCAL_DIV, PWM_COUNT_US(period, PWM_PSCAL_DIV), PWM_COUNT_US(period*pwmc, PWM_PSCAL_DIV));
- adc_done = 0;
- }
- }
-
复制代码
测试图片,
随着加速,蜂鸣器音调会越来越高,LED会越来越亮,反之亦然。
0
|
|
|
|