HT32F52352 PWM控制舵机
这段代码是用来初始化HT32F52352开发板的GPTM PWM输出,包括选择使用的GPIO端口、配置GPTM定时器和GPTM输出模式。这段代码用来控制四个舵机,其中cs()函数通过改变PWM波的占空比来控制舵机的转动方向和角度。下面使用到的舵机控制针脚为 PA4 PA5 PA6 PA7。
·
下面使用到的舵机控制针脚为 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度
文中提到的延时函数附下:
更多推荐
所有评论(0)