当前位置: 首页 > news >正文

GD32 输入捕获以及PWM

GD32输入捕获以及PWM

框架(含时钟)

image-20260226132418815

image-20260226153740345

1、TIMER0(高级定时器)(120MHz) PA8 PWM输出

void T0_PWM_PA8(void)//T0 120MHz PA8输出2KHz方波,120MHz/100=1.2MHz,1.2MHz/600=2KHz
{/* ===== 变量必须放在最前面 ===== */timer_oc_parameter_struct timer_ocintpara;timer_parameter_struct timer_initpara;// 初始化BELL控制引脚为复用功能推挽输出模式,引脚速度设置为50MHzgpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);// 使能TIMER0定时器的时钟rcu_periph_clock_enable(RCU_TIMER0);// 复位TIMER0定时器到默认值timer_deinit(TIMER0);/* TIMER0 configuration */timer_initpara.prescaler         = 99;        // 预分频值设置为99,用于对定时器时钟进行分频timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;  // 边沿对齐模式,选择边沿计数模式timer_initpara.counterdirection  = TIMER_COUNTER_UP;    // 计数方向设置为向上计数timer_initpara.period            = 599;      // 周期值设置为599,决定定时器的计数周期timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;   // 时钟分频因子设置为1,不分频timer_initpara.repetitioncounter = 0;        // 重复计数器值设置为0,不重复计数// 调用定时器初始化函数,使用上述参数配置定时器0timer_init(TIMER0, &timer_initpara);/* PWM参数 */
/* 配置定时器输出比较中断参数 */timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;      // 使能输出比较输出timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;    // 禁能互补输出timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH; // 设置输出比较极性为高电平timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH; // 设置互补输出极性为高电平timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW; // 设置空闲状态下输出比较输出为低电平timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; // 设置空闲状态下互补输出为低电平/* 配置TIMER0通道0的输出参数 */timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocintpara);/* 设置通道0的输出脉冲值为300,这将产生50%占空比的PWM波形 */timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, 300); // 50%占空比
/* 配置通道0的输出模式为PWM0模式 */timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0);
/* 禁用通道0的输出影子寄存器,使配置立即生效 */timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE);/* 启用TIMER0的自动重载影子寄存器,使自动重载值在更新事件时生效 */timer_auto_reload_shadow_enable(TIMER0);
/* 启用TIMER0的主输出,使PWM信号能够从引脚输出 */timer_primary_output_config(TIMER0, ENABLE);/* 启动TIMER0定时器 */timer_enable(TIMER0);  // 调用timer_enable函数启用TIMER0定时器
}/// @brief 全占空比开启
void BellEnable(void)
{timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,499);//100%占空比}/// @brief 关,0占空比
void BellDisable(void)
{timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,0);///0%占空比
}

分析:

输出脚设置为复用推挽输出

使能定时器

根据定时器时钟计算分频和重装值

2、TIMER1(通用)(60MHz) PA8 PWM输出


void TIMER1_PWM_Init(void)//T1,60Mhz,PA1输出25KHz方波,120MHz/1=120MHz,120MHz/4800=25KHz
{timer_parameter_struct TIMER_StructInit;timer_oc_parameter_struct timer_oc_parameter_struct_Init;rcu_periph_clock_enable(RCU_TIMER1);rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_AF);gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1); // PA1 -> TIMER1_CH1timer_deinit(TIMER1);		TIMER_StructInit.clockdivision     = TIMER_CKDIV_DIV1;TIMER_StructInit.alignedmode       = TIMER_COUNTER_EDGE;TIMER_StructInit.counterdirection  = TIMER_COUNTER_UP;TIMER_StructInit.prescaler         = 1 - 1;      // PSC = 0TIMER_StructInit.period            = 4800 - 1;   // ARR = 4799 (25kHz @ 120MHz)timer_init(TIMER1, &TIMER_StructInit);/* 输出通道配置 */timer_oc_parameter_struct_Init.outputstate = TIMER_CCX_ENABLE;timer_oc_parameter_struct_Init.ocpolarity  = TIMER_OC_POLARITY_HIGH;timer_channel_output_config(TIMER1, TIMER_CH_1, &timer_oc_parameter_struct_Init);timer_channel_output_shadow_config(TIMER1, TIMER_CH_1, TIMER_OC_SHADOW_ENABLE);timer_channel_output_mode_config(TIMER1, TIMER_CH_1, TIMER_OC_MODE_PWM0);/* 初始占空比设为 50% (2400/4800) */timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, 2400); timer_enable(TIMER1);
}/* 设置TIMER1PWM的预分频值 */
void PWM_SetPrescaler(uint16_t pre)
{timer_prescaler_config(TIMER1, pre - 1, TIMER_PSC_RELOAD_UPDATE);  //设置预分频值,预分频值立即加载
}/* 设置TIMER1PWM的输出比较值 */
void PWM_SetCHCV(uint16_t CHCV)
{timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1, CHCV);  //设置预分频值,预分频值立即加载
}

3、输入捕获T2_CH0(PA6)

/* TIMER2输入捕获初始化 */
void TIMER2_PWMI_Init(void) // PA6
{	timer_parameter_struct TIMER_StructInit;timer_ic_parameter_struct timer_icinitpara;rcu_periph_clock_enable(RCU_TIMER2);rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_AF);gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);timer_deinit(TIMER2);/* 关键修改:将预分频从 1200 改为 12,采样频率变为 10MHz */TIMER_StructInit.clockdivision     = TIMER_CKDIV_DIV1;TIMER_StructInit.alignedmode       = TIMER_COUNTER_EDGE;TIMER_StructInit.counterdirection  = TIMER_COUNTER_UP;TIMER_StructInit.period            = 65536 - 1; TIMER_StructInit.prescaler         = 12 - 1;    // 120M / 12 = 10MHz 采样率timer_init(TIMER2, &TIMER_StructInit);nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);nvic_irq_enable(TIMER2_IRQn, 1, 1);/* 配置 PWM 输入模式 */timer_icinitpara.icpolarity  = TIMER_IC_POLARITY_RISING;timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;timer_icinitpara.icfilter    = 0x0;/* 使用该函数会自动配置 CH0 为上升沿,CH1 为下降沿 */timer_input_pwm_capture_config(TIMER2, TIMER_CH_0, &timer_icinitpara);/* 从模式配置:上升沿触发复位 CNT */timer_input_trigger_source_select(TIMER2, TIMER_SMCFG_TRGSEL_CI0FE0);timer_slave_mode_select(TIMER2, TIMER_SLAVE_MODE_RESTART);timer_interrupt_enable(TIMER2, TIMER_INT_CH0);timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH0);timer_enable(TIMER2);
}
uint32_t num1, num2; // 使用 32 位防止溢出,虽然 16 位也够
float fre, duty;void TIMER2_IRQHandler(void)
{if(SET == timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_CH0)){timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH0);		/* 读取捕获寄存器 */// CH0 捕获周期 (Rising to Rising)num1 = timer_channel_capture_value_register_read(TIMER2, TIMER_CH_0) + 1; // CH1 捕获高电平 (Rising to Falling)num2 = timer_channel_capture_value_register_read(TIMER2, TIMER_CH_1) + 1; if(num1 > 0){/* 占空比计算:高电平计数值 / 周期计数值 */duty = (float)num2 / (float)num1 * 100.0f;/* 频率计算:采样频率 (10,000,000Hz) / 周期计数值 */fre = 10000000.0f / (float)num1; }}
}
http://www.jsqmd.com/news/439122/

相关文章:

  • 用数据说话 8个AI论文网站测评:本科生毕业论文写作全攻略
  • 机架式服务器都有哪些好处?
  • 基于11647例临床数据,法国团队首次实现基于机器学习的HCC肝移植双重死亡风险精准预测
  • 塔式服务器的优点都有哪些?
  • 拖延症福音!降AI率工具 千笔AI VS PaperRed,专为本科生打造
  • 杨立昆的AMI与世界模型JEPA
  • 2026OMO电商零售新趋势,这些平台受青睐,价值共享电商零售/数字化运营管理,OMO模式电商零售平台推荐排行榜 - 品牌推荐师
  • 2026年天津离婚房产律师电话查询推荐:五大律师实力盘点 - 品牌推荐
  • 效率直接起飞!9个一键生成论文工具测评:本科生毕业论文+开题报告写作全攻略
  • 好的洗发水有哪些品牌?2026权威排名与深度解析 - 包罗万闻
  • 2026年天津离婚房产律师电话查询推荐:高效联系与沟通要点 - 品牌推荐
  • 美国FCC认证详解!无线产品卖家必看,清关+平台上架必过攻略
  • 金属表面清洁度检测设备哪家好 西恩士工业稳居行业优选 - 仪器权威论
  • Pbootcms忘记管理员密码怎么办?重置还是找回,附修改方法和代码
  • 吐血推荐!降AIGC软件 千笔 VS 笔捷Ai,继续教育首选
  • 三层抽象结构:一种可复用的抽象层设计词汇
  • 2026年天津继承诉讼律师电话查询推荐:精选推荐与使用指南 - 品牌推荐
  • 2026年天津遗嘱继承律师电话查询推荐:解决继承纠纷指南 - 品牌推荐
  • GD32F305 CAN配置
  • 金属表面清洁度检测设备品牌排行 西恩士工业稳居优选榜首 - 仪器权威论
  • 2026年天津离婚房产律师电话查询推荐:精选推荐与使用指南 - 品牌推荐
  • 2026京津冀家庭全屋墙面刷新公司选购,大型靠谱品牌在哪 - mypinpai
  • 2026高空作业车排行榜:曲臂高空作业车/曲臂高空车/电动高空作业车/电动高空车/登高车高空作业车/选择指南 - 优质品牌商家
  • STM32输入捕获测频率
  • 深聊KBSGZY矿用隔爆型移动变电站,山西地区哪家生产商靠谱? - myqiye
  • 2026年天津遗嘱继承律师电话查询推荐:专业服务与联系指引 - 品牌推荐
  • 2026年南昌知名的新能源汽车学校排名,哪家性价比高? - myqiye
  • 2026年天津继承诉讼律师电话查询推荐:高效解决继承纠纷 - 品牌推荐
  • 聊聊北京九州木子办公设备实力如何,京津冀区域值得选的办公设备商 - mypinpai
  • 2026年全国受欢迎的实力强的无人机仿真软件排名TOP10 - 工业推荐榜