在我的pad台灯项目,我使用了三个定时器,定时器一用作oc输出,其余两个定时器用于检测按键和pid服务函数,使用光敏电阻作为传感器用电阻分压的原理来测量光敏电阻的电压,使用了abc一通道一来测量abc的值,使用时有噪声 有待后续去改进,目前是直接把低2位去掉, Pid的函数部分学习的是江科大的pid部分,在切换目标值的时候,使用了exti外部中断来检测,由于这种方式存在按键抖动而产生跳跃的情况,又使用了板载的按键,用定时器来进行扫描,这样比较稳定,并且while函数里是一点占用都没有,也就代表着main函数里while是空的,可以自行运行其他你自己的定制功能,使用的串口部分把内部的abc值输出到屏幕上,这样可以直接画出折线图,更加的直观实现了数据的可视化,由于本人的实力有限,以及时间的来不及,用了4天时间写完代码,并且pid也没有怎么去调,可以复刻项目,然后去调整,也算是一个遗憾,剩下的部分和实现细节可以通过项目代码来进一步了解,
首先通过官网的keil支持包搭建G0001的搭建环境,可以直接复制官网的安装支持和示例代码来搭建
需要注意的是,自己搭建的部分,由于官网的示例代码是分开的,所以需要手动更改库函数存放的地址,由于已经有人给出处理方法,这里不再赘述,本测评主要讲解PID台灯实现的细节。
首先使用了内部的TIM4来实现定时器扫描按键的部分,代码如下:

通过定时器的中断来实现扫描,每20毫秒进入一次中断,按键读取的部分采取非阻塞式,原理是如果长时间按住只会让标志位保持不变,松手触发另一个标志位共同决定按键状态,根据此,可以编写长按的代码,思路是标志位累加,达到一定数值以后检测松手,松手检测过关就会执行长按代码。
在PID函数里,采取的定时器TIM3,优先级由于文档写的是四个优先级,所以为了确保按键读取正确,它的优先级是低于按键定时器的优先级,由于按键的处理时间和进入频率很低,所以对PID的处理影响很小,代码如下:

在这里用了位置式PID来处理PID问题,由于存在ADC的滤波的影响,所以在此使用均值滤波来处理,可见滤波后的adc上下幅度很小,也算一种进步。

在这里使用STC_ISP来接受串口数据并且可视化
使用了EXTI外部中断来完成按键的读取,由于存在抖动且没有消抖,所以和预想的一样,按下一次数值累加多次,优先级比较低,是第三优先级;代码如下:

这个是中断处理函数,其中PID_TARGET是extern声明的外部变量:

根据我的使用习惯,在这里需要注意一点,这里使用的一个函数“GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_2);”在使用内部AF映射功能时,需要使用这个函数再次强调一下,除了这个特点,其他的部分和结构体和stm的标准库是一模一样的,很方便我们的开发

在此强调一下,NVIC只有四个优先级,0X00到0X03,需要注意的是,虽然看起来很少,但是实际使用起来,合理搭配也是足够的。
在项目的最后,使用了START文件封装了底层ADC,USART,TIM的使用,提供了API接口以便其他项目的开发和工作。
OLED屏幕使用了江科大的OLED移植过来,软件IIC简化开发,由于速度48MHZ,速度也不差。
ADC部分着重讲解一下anychannal模式,而且实测,即使我不想使用Anychannal模式,ADC采样根本不执行,所以在这里简介一下这个小功能。
Anychannal是可以指定ADC通道的采样顺序,手册里说,如果不使用,按照默认的从低到高走(0~7),如果使用,例如我制定了0,2,4,5,7,这几个通道,我想先采样2,然后是0,4,7,5,这样的乱序,使用这个功能就很好,是需要使用ADC_AnyChannelSelect(ADC1, ADC_AnyChannel_0, ADC_Channel_7)函数依次指定通道即可,函数的参数是:ADC的编号,想指定的采样通道(想把它排在哪里),ADC通道的原始通道,所以指定tongdaoer可以这样写: ADC_AnyChannelSelect(ADC1, ADC_AnyChannel_0, ADC_Channel_2);

关于USART部分代码,也需要注意AF_PinConfig的问题,其他的配置和stm的标准库无异。

这里之开启了发送单元,其他的部分可以续写,完成双向通信的功能。
OLED的api在注释里写的很清楚,而更新了写汉字的函数,可以在oled上面写自己的汉字

在此函数的部分讲解完了,做这个项目测试了大部分的外设,可以较为全面的了解这个芯片的整体性能,根据实测,OC功能很完美,评论占空比很准(需要注意的是,我的代码里定时器的预分频器和预装载寄存器都没有注意到减一,0也算一位,所以应该整体减一,例如我想得到频率是1000hz的定时器,预分频器因该是48000-1=47999,而不是48000,这是个失误,忘记了0也算一位。)
项目从开始到结束用了四天时间,PID由于时间和技术问题没有调的很完美,也是一个遗憾。
说这么多可以不如自己看看代码来的理解深刻,欢迎大家下载我的项目文件和观看我的示例视频,如有错误也欢迎指正。
项目的地址是
通过网盘分享的文件:MM32_G0001.zip
链接: https://pan.baidu.com/s/1psozFGz5dc12hucUJBBshQ?pwd=0000 提取码: 0000
视频链接: https://b23.tv/bFrw6A6


