下面使用到的舵机控制针脚为 PA4 PA5 PA6 PA7

time.h

#ifndef _TIME_H_
#define _TIME_H_
#include "ht32f5xxxx_bftm.h"

#define HTGPIO_PIN (GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7)


void GPTM_PWM_init(void);
#endif

time.c

#include "time.h"
#include "delay.h"



//PWM
//arr: 200-1
//psc: 4800-1
//GPIO PA4 PA5 PA6 PA7
void GPTM_PWM_init()
{
 
    TM_TimeBaseInitTypeDef TimeBaseIniture;   //结构体
    TM_OutputInitTypeDef   OutIniture;
 
    CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
    CKCUClock.Bit.PA         = 1;       //GPIOA时钟打开
    CKCUClock.Bit.AFIO       = 1;       //复用时钟
    CKCUClock.Bit.GPTM0      = 1;
    CKCU_PeripClockConfig(CKCUClock, ENABLE);      //时钟使能
	
    AFIO_GPxConfig(GPIO_PA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, AFIO_MODE_4);              
    //开启复用功能
	GPIO_DirectionConfig(HT_GPIOA,HTGPIO_PIN,GPIO_DIR_OUT);
	TM_ClearFlag(HT_GPTM0, TM_FLAG_UEV);  
    TM_OutputStructInit(&OutIniture);    

    //定时器初始化

    TimeBaseIniture.CounterMode = TM_CNT_MODE_UP;            //边沿对齐向上模式
    TimeBaseIniture.CounterReload = 200-1;                       //计数重装载计数器
    TimeBaseIniture.Prescaler = 4800-1;                           //预分屏系数
    TimeBaseIniture.PSCReloadTime=TM_PSC_RLD_IMMEDIATE;    //立即重装载
    TM_TimeBaseInit(HT_GPTM0,&TimeBaseIniture);
 
//  PA4
    OutIniture.Channel= TM_CH_0;
    OutIniture.Control= TM_CHCTL_ENABLE;         //GPIO使能通道
    OutIniture.OutputMode=TM_OM_PWM1 ;          //GPIO 通道 PWM1 输出模式 PWM2 翻转模式
    OutIniture.Polarity= TM_CHP_INVERTED;    //GPTO 通道极性是低电平或者下降沿   
   // OutIniture.Compare=200;                      // 配置占空比
    TM_OutputModeConfig(HT_GPTM0,TM_CH_0,TM_OM_PWM1);
    TM_OutputInit(HT_GPTM0,&OutIniture);
 
 
// PA5
    OutIniture.Channel=TM_CH_1;
    OutIniture.Control=TM_CHCTL_ENABLE;        
    OutIniture.OutputMode=TM_OM_PWM1;          
    OutIniture.Polarity=TM_CHP_INVERTED;         
    //OutIniture.Compare=200;                     
    TM_OutputModeConfig(HT_GPTM0,TM_CH_1,TM_OM_PWM1);
    TM_OutputInit(HT_GPTM0,&OutIniture);


// PA6
    OutIniture.Channel=TM_CH_2;
    OutIniture.Control=TM_CHCTL_ENABLE;         
    OutIniture.OutputMode=TM_OM_PWM1;          
    OutIniture.Polarity=TM_CHP_INVERTED;             
    //OutIniture.Compare=200;                     
    TM_OutputModeConfig(HT_GPTM0,TM_CH_2,TM_OM_PWM1);
    TM_OutputInit(HT_GPTM0,&OutIniture);
 
//  PA7
    OutIniture.Channel=TM_CH_3;
    OutIniture.Control=TM_CHCTL_ENABLE;         
    OutIniture.OutputMode=TM_OM_PWM1;         
    OutIniture.Polarity=TM_CHP_INVERTED;       
    // OutIniture.Compare=200;                      
    TM_OutputModeConfig(HT_GPTM0,TM_CH_3,TM_OM_PWM1);
    TM_OutputInit(HT_GPTM0,&OutIniture);
	
    TM_IntConfig(HT_GPTM0, TM_INT_CH0CC|TM_INT_CH1CC|TM_INT_CH2CC|TM_INT_CH3CC, ENABLE);          
    //中断	
    TM_Cmd(HT_GPTM0,ENABLE);  //使能计数
}

这段代码是用来初始化HT32F52352开发板的GPTM PWM输出,包括选择使用的GPIO端口、配置GPTM定时器和GPTM输出模式。

详细注释如下:

  • TM_TimeBaseInitTypeDef和TM_OutputInitTypeDef是HT32F系列芯片定时器TM_TimeBaseInit和输出TM_OutputInit结构体的别名,定义在"ht32fxxxx_tm.h"文件中。
  • CKCU_PeripClockConfig_TypeDef是HT32F系列芯片时钟控制单元CKCU_PeripClockConfig结构体的别名,定义在"ht32fxxxx_ckcu.h"文件中。
  • CKCUClock是一个CKCU_PeripClockConfig_TypeDef类型的结构体变量,用来配置要开启的外设时钟,其中PA端口所对应的时钟和GPTM0定时器所对应的时钟都被开启。
  • CKCU_PeripClockConfig()函数用来开启或关闭外设的时钟,第一个参数为CKCU_PeripClockConfig_TypeDef类型的结构体变量,第二个参数为ENABLE或DISABLE,分别表示开启和关闭。
  • AFIO_GPxConfig()函数用来配置GPIO的复用模式,第一个参数为要配置的GPIO端口,第二个参数为要配置的GPIO引脚,第三个参数为要配置的GPIO外设模式。
  • TM_ClearFlag()函数用来清除GPTM定时器标志,第一个参数为要清除标志的GPTM定时器,第二个参数为要清除的标志位。
  • GPIO_DirectionConfig()函数用来配置GPIO端口的输入或输出模式,第一个参数为要配置的GPIO端口,第二个参数为要配置的GPIO引脚,第三个参数为GPIO_DIR_IN或GPIO_DIR_OUT,分别表示输入和输出。
  • TM_OutputStructInit()函数用来初始化TM_OutputInitTypeDef结构体变量,将其成员变量设置为默认值。
  • TimeBaseIniture结构体变量用来初始化GPTM的时间基础设置,包括计数器模式、计数器重载值和预分频器分频值。

main.c

#include "ht32.h"
#include "ht32_board.h"
#include "delay.h"
#include "time.h"


void cs()
{
	uint8_t i = 175;
	for(i = 175; i<=200; i = i + 5)
	{
		TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,i);
		TM_SetCaptureCompare(HT_GPTM0,TM_CH_1,i);
		TM_SetCaptureCompare(HT_GPTM0,TM_CH_2,i);
		TM_SetCaptureCompare(HT_GPTM0,TM_CH_3,i);
		delay_ms(500);
	}
	i = 200;
	for(i = 200; i>=175; i = i - 5)
	{
		TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,i);
		TM_SetCaptureCompare(HT_GPTM0,TM_CH_1,i);
		TM_SetCaptureCompare(HT_GPTM0,TM_CH_2,i);
		TM_SetCaptureCompare(HT_GPTM0,TM_CH_3,i);
		delay_ms(500);
	}
}
int main()
{
	
	GPTM_PWM_init();
	
	while(1)
	{
		cs();
	}
}

这段代码用来控制四个舵机,其中cs()函数通过改变PWM波的占空比来控制舵机的转动方向和角度。

详细注释如下:

  • TM_SetCaptureCompare()函数用来设置GPTM定时器的捕获比较值,第一个参数为要配置的GPTM定时器,第二个参数为要配置的GPTM输出通道,第三个参数为PWM波的占空比,取值范围是0-200,表示占空比的百分比。
  • delay_ms()函数用来延时一定的时间,第一个参数为要延时的时间,单位是毫秒。
  • cs()函数通过循环的方式来改变PWM波的占空比,让四个舵机按照一定的顺序旋转,既实现了对单个舵机的控制,也可以实现对多个舵机的同时控制。函数中先将占空比从175慢慢增加到200,然后再从200慢慢减小到175,每次改变占空比的大小为5,持续时间为500ms,可以根据实际需要来调整控制时间和
  • 舵机的五个角度分别为    175  = 180度
    •                                  180  = 135度
    •                                  185  = 90度
    •                                  190  = 45度
    •                                  195  = 0度

 文中提到的延时函数附下:

HT32F52352 点灯+延时函数

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐