接触单片机以来,总想做一些趁手仪器仪表工具耍耍,但由于自己较为懒散,空有想法一直没有付诸实践。前几日翻到一个stm32f4的最小系统板,造轮子的热情竟然空前高涨起来。搜索资料又编程调试了半天,终于得偿所愿。系统最终参数为频率 10hz - 42Mhz,占空比任意可调(实际占空比受频率所限,如42M时,只能是50%)
一、工作目标和问题确定
手头的单片机为32位单片机,显然定时器应优选32位的;如果该定时器有PWM方式,能够在非中断的情况下自动输出占空比可调的方波,显然是上上之选。单片机为最小系统板,显然使用串口完成人机界面最为简洁。
经查阅资料,tim2和tim5是32位定时器,且均有pwm方式,总线频率为84M,符合需要。故问题圈定如下:
(1)找到tim2修改占空比和频率的函数。
(2)确定一个较为简洁的频率、占空比、时间的修改方式。
二、问题解决
(1)修改占空比和频率
(为扩展方波频率输出范围,首先应将分频数设置为0,即不分频)
占空比修改的函数较为简单,主要通过系统函数TIM_SetCompare1确定,该函数原型如下:
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1)
其中参数TIMx为要操作的定时器,Compare1为比较数值。从PWM工作方式可以看出
在当前计数数值小于Compare1时,系统输出低电平,这和我们常见的高电平和总周期之比不符,故此处应采用周期(即下文的分频值)减去输入高电平的时长。
修改频率时稍显繁琐,由于必须保证比较数值应在0和周期之间,故必须同时修改。其中修改频率的库函数为TIM_SetAutoreload,其原型如下:
TIM_SetAutoreload(TIM_TypeDef* TIMx, uint32_t Autoreload)
其中Autoreload为相对于84Mhz的脉冲个数,或者分频数。为减低自己的使用难度,此处首先从输入中得到频率值f,然后令分频值div=84000000/f+0.5得到分频值,最后回馈用户频率为
f=84000000/div,以保证用户反馈数值和示波器测量数值一致。
(2)人机界面
考虑到输入控制的简洁性原则,主要控制使用引导字符+数据的方式。其中时间修改指令设置如下:
Thhmmss
频率修改指令如下:
Fnum1
具体频率根据输入字符长度并通过字符和数字之间的转换获得。
占空比修改(此处实际输入的为高电平脉冲数)指令如下:
Dnum2
高电平脉冲数根据输入字符长度并通过字符和数字之间的转换获得。
考虑易用性原则,在程序中加入了定时提醒当前波形输出参数(频率、占空比、周期脉冲数)等功能,测试发现,1M赫兹以上低电平开始明显上升;42Mhz时达到最大,波形接近三角波。其他和设计一致。