电机驱动需要3相6开关信号进行驱动,这个测评测试高级定时器产生PWM波的功能;定时器可以分为3个模块,第一个模块是时基单元,为了设置定时器基本计数模式等,第二个模块是输出(OC)模块,产生3相6开关信号等功能,第三个模块是捕获输入模块,用来检测输入引脚跳变;定时器结构如图:

设置的程序也是和这三个模块有关,这个工程我实现了tim8输出上下桥臂产生pwm,由定时器tim8的ch3通道进行控制;查询数据手册知道使用的引脚,按照这个表格进行接线,pb1和pc8接到逻辑分析仪;

接下来分析代码:
**#include** "main.h"
**void** **InitBeepTimer8** ( **void** )
{
Timer_Init_Struct TIM8_TimeBaseStructure;
Timer_OC_Parameter_Struct TIM8_OCInitStructure;
Timer_Break_DeadTime_Struct TIM8_BDTRInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//设置需要的结构体变量
RCC_Peripheral_ClockEn( *GPIOCCLC* | *GPIOBCLC* )
RCC_Peripheral_ClockEn( *AFIOCLC* )
RCC_Peripheral_ClockEn( *TIM8CLC* )
//打开必要的外设时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = *GPIO_Mode_AF_PP* ;
GPIO_InitStructure.GPIO_Speed = *GPIO_Speed_50MHz* ;
GPIO_Init(GPIOC, &GPIO_InitStructure);
** //设置2根引脚输出模式**
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = *GPIO_Mode_AF_PP* ;
GPIO_InitStructure.GPIO_Speed = *GPIO_Speed_50MHz* ;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* PWM TIM8 Peripheral Configuration ------------*/
TIM8_TimeBaseStructure.prescaler = 12; //预分频器设置
TIM8_TimeBaseStructure.alignedmode = TIMER_COUNTER_CENTER_DOWN;
TIM8_TimeBaseStructure.counterdirection = TIM_CounterMode_Up;
TIM8_TimeBaseStructure.period = APB2_FREQ / 4000;//20000;//4K频率
TIM8_TimeBaseStructure.clockdivision = TIM_CR1_CKD_0;
TIM8_TimeBaseStructure.repetitioncounter = 1;
Timer_Init(TIMER8, &TIM8_TimeBaseStructure);
** //时基单元的工作方式设置,决定了周期计数模式等**
TIM8_OCInitStructure.ocmode = TIMER_OCMODE_PWM2;
TIM8_OCInitStructure.outputstate = TIMER_CCx_ENABLE;
TIM8_OCInitStructure.outputnstate = TIMER_CCxN_ENABLE;
TIM8_OCInitStructure.pulse = APB2_FREQ / 4000 / 2;
TIM8_OCInitStructure.ocpolarity = TIMER_OCPOLARITY_HIGH;
TIM8_OCInitStructure.ocnpolarity = TIMER_OCNPOLARITY_LOW;
Timer_PWM_ConfigChannel(TIMER8, TIMER_CH_3, &TIM8_OCInitStructure);
** //输出功能设置,使能输出,输出极性等**
Timer_CCRx_Preload_Enable(TIMER8, TIMER_CH_3);
** //使能比较寄存器双缓冲结构**
TIMER8->CR2 |= TIMER_TRGO_UPDATE;
}
**void** **pwmControl** (uint8_t st)
{
Timer_Cmd(TIMER8, *ENABLE* );
Timer_MOE_Enable(TIMER8);
//启动定时器工作
}
**void** **pwm_demo** ( **void** )
{
InitBeepTimer8();
pwmControl(1);
cfprintf("pwm open\\n");
}
为了测试程序是否执行到位还添加了LED控制代码:
demo(); **
while (1)
{ cf_delay_ms(1000);
cfprintf("A-Z a-Z 0-9 :%u...\\r\\n",CF_TIME_MS);
GPIO_Set_Data(GPIOB, GPIO_NUM_10, GPIO_DATA_SET);
cf_delay_ms(500);
GPIO_Set_Data(GPIOB, GPIO_NUM_10, GPIO_DATA_CLEAR);
cf_delay_ms(500);
}
通过代码阅读知道代码结构与3.5标准库非常相似,如果有基础,能很快适应该芯片的编程;以下是逻辑分析仪结果和接线视频。
