RISC-V技术论坛
直播中

安安踢球球

6年用户 113经验值
擅长:电源/新能源 嵌入式技术
私信 关注
[经验]

【微五科技CF5010RBT60开发板试用体验】+高级定时器输出PWM测试

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

image.png

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

image.png

接下来分析代码:

**#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();  **//执行pwm设置程序**

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标准库非常相似,如果有基础,能很快适应该芯片的编程;以下是逻辑分析仪结果和接线视频。
image.png

88e6ee37a3460e63dd5043e432d41bc7

更多回帖

发帖
×
20
完善资料,
赚取积分