【东芝TT_M3HQ开发板试用体验】+PWM占空比

简介:本篇文章是我再学习使用PWM的一些经验和小小体会,还是要感谢官方给与这次机会,东芝TT_M3HQ开发板总体来说质量做工非常精致值得学习,东芝官方给大家提供的例程和固件库也是非常好的,他们写程序的方法和规范化值得学习.也希望官方能公布些更详细的使用手册,方便我们进行深入开发.

一.硬件介绍
例程PDF地址:TMPM3Hy_v1.2.01\TMPM3Hy_v1.2.01\TMPM3Hy_v1.2.0\Project\Examples\T32A\Timer_PPG\doc
官方的介绍比较简单,刚开始看这个介绍我也是有点晕头.接下来详细解读一下~~

二.引脚功能介绍
功能引脚 PJ0  / PV0 / PV1 / PA1
PJ0 这这个例程当中做为PWM输出引脚使用
S4(PV0) 用来做按键使用(低电平有效)   功能相当于确认按键
S5(PV1) 用来做按键使用(低电平有效)   功能用作于调占空比使用
TXD(PA1) 串口打印 它是板载的USB串口
本例程无RXD引脚的配置,应该是官方为了PWM输出的效果关掉了串口中断


三.软件介绍
官方例程比较有意思,也是和其他芯片厂商有着很大的区别.
1.BSP.c用来配置引脚的文件,它里面包含了所有的引脚配置,一幕了然,很方便. 其中包含了串口波特率的配置也在其中.
2.bsp_pulse.c文件  主要用于脉冲输出初始化设置
3.bsp_timer.c文件 只用用于定时器配置,PWM输出,定时器可以说是主要环节
4.bsp_uart_io.c文件 串口配置
5.bsp_psw.c 文件  按键输入捕获 为什么说是捕获呢 因为它使用的时中断
6.Periph_drver 为底层固件库 如果想深入学习可以看看,里面用结构体用的非常好,程序结构值得学习.如果只是想使用大可不必理会

四.主要程序介绍
也就是介绍下main.c文件,例程库内你会发现除了main.c不同其余的的程序文件都是相同的,
这里面写的较为复杂,差异的功能都是在此进行配置.
typedef struct
{
    t32a_t      t32a_timer;                /*!< Application      :T32A.     */
    t32a_t      t32a_pulse;                /*!< Application      :T32A.     */
    sw_t        sw[(uint32_t)BSP_PSW_MAX];  /*!< Application :Push SW            */
    timer_t     timer;             /*!< Application :Timer (ims timer). */
    pulse_t     pulse;             /*!< Application :Timer (Output Pulse timer). */
    gpio_t      gpio_obj;            /*!< Application :GPIO. */
} instance_t;

PWM配置结构体,可以仿真看看其结构体内的数据, (instance) 注意timer_t 和 pulse 是PWM输出占空比主要参数
static uint32_t tgtRisingTiming[Rate] = { 10U, 25U, 50U, 75U, 90U }; /* rigingtiming: 10%, 25%, 50%, 75%, 90% */

PWM占空比在此被定义成数组形式,S5触发一次Rate加1.
typedef enum
{
    PROC_RUN,            /*!< Timer Start    :RUNNING.   */
    PROC_START,            /*!< Timer Start    :RUNNING.   */
    PROC_DUTY_CHANGE,      /*!< Duty Change    :CHANGE.       */
} Processing;

以上结构体是按键的返回值
case PROC_DUTY_CHANGE:
{
     /* Pulse Timer Stop */
     pulse_timer_stop(&instance.pulse);
     /* Pulse Timer Finalize */
     pulse_timer_finalize(&instance.pulse);
     delay(0xFFU);         /* noise cancel */
     FDuty += 10;   
     if (FDuty >= 90) {  /* change leadingtiming rate
         FDuty = 10;
     } else {
         /* Do nothing */
     }
     /* RisingTiming Value SET */
     if(pulse_driver_initialize() == TXZ_ERROR) {
         /* no processing */
     }
     /* Risingtiming rate Display */
     risingtiming_change_display();
     proc = PROC_RUN;
     break;
}

以上是我做了一点更改的执行函数,主要作用没有做任何改变.PWM更改占空比值,会先让其停止工作,然后在重新初始化PWM相关配置.个人经验基本上我所用过的单片机都是这种逻辑操作

总结:以上是我经过几天的业余时间学习的一些体会,希望可以方便后来者开发使用.
资料下载链接 https://mbb.eet-china.com/forum/topic/73382_1_1.html