发布网友 发布时间:2022-05-15 23:46
共1个回答
热心网友 时间:2024-02-29 06:46
摘要// tim1.c/** * TIM1 PWM 输入初始化 */void TIM1_PWMI_Init(){ // 重置初始化 TIM1_DeInit(); // 初始化 TIME1 时基单元 // 16预分频,向上计数,每 1s/1M = 1us 计数器值加 1(累加 1000 次需要 1 毫秒) // 参数说明:预分配值,计数模式,自动重装载值(计数器值到 65536 后重新装载),计数器起始值(计数器值重新装载后从0开始) TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, 65536-1, 0); // PWM的通道1配置 // PWM的通道2无需配置,因为 TIM1_PWMIConfig(...) 内部已经进行了配置 // // 参数说明: //1. TIM1 通道1 //2. 极性:上升沿捕获 //3. 输入脚:TIM1_ICSELECTION_DIRECTTI 表示直接将 T1 信号经过 TI1FP1 发送给 IC1 模块进行处理 //4. 预分频:意思是控制在多少个输入周期做一次捕获;【经过实际测试,复位触发模式下该值无效,都是按照1分频执行】 // 1M 系统时钟,捕获 20Hz PWM 一个周期需要计数 50000 次(1M/20=50000),TIM1 最大计数有65536,可以捕获 // 1M 系统时钟,捕获 15Hz PWM 一个周期需要计数 66666 次(1M/15=66666),TIM1 最大计数有65536,无法捕获 //5. 滤波频率:经历几个周期相同的跳变则波形稳定,此处不滤波。如果频率捕获偶发值不对,那么可以启用 0x02(4个事件) TIM1_PWMIConfig(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV1, 0x02); // 选择输入触发源 // 设置 TI1FP1 的信号为触发输入源 // 芯片根据触发源的咨询记录 · 回答于2021-09-17计算占空比和频率已知有一输入信号PWM捕捉模块,其时钟为5MHz,其高电平时间捕捉值为DutyTime(无符号数),周期时间捕捉值为PeriodTime(无符号数)。编写一个软件模块,实现此PWM信号占和频率的计算(用频率的是10倍表示)【【STM8】PWM 捕获实战:占空比和频率(TIM1)_外来物种-CSDN博客_stm8捕获原理】https://blog.csdn.net/dmlk31/article/details/116751685看不懂,好复杂,不能捕获他的上升沿下降沿时间来计算占空比和频率吗?点击下链接我看了,看不懂PWM 采集规定是:CH1 上升捕获,CH2 下降沿捕获怎么编程呢?// tim1.c/** * TIM1 PWM 输入初始化 */void TIM1_PWMI_Init(){ // 重置初始化 TIM1_DeInit(); // 初始化 TIME1 时基单元 // 16预分频,向上计数,每 1s/1M = 1us 计数器值加 1(累加 1000 次需要 1 毫秒) // 参数说明:预分配值,计数模式,自动重装载值(计数器值到 65536 后重新装载),计数器起始值(计数器值重新装载后从0开始) TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, 65536-1, 0); // PWM的通道1配置 // PWM的通道2无需配置,因为 TIM1_PWMIConfig(...) 内部已经进行了配置 // // 参数说明: //1. TIM1 通道1 //2. 极性:上升沿捕获 //3. 输入脚:TIM1_ICSELECTION_DIRECTTI 表示直接将 T1 信号经过 TI1FP1 发送给 IC1 模块进行处理 //4. 预分频:意思是控制在多少个输入周期做一次捕获;【经过实际测试,复位触发模式下该值无效,都是按照1分频执行】 // 1M 系统时钟,捕获 20Hz PWM 一个周期需要计数 50000 次(1M/20=50000),TIM1 最大计数有65536,可以捕获 // 1M 系统时钟,捕获 15Hz PWM 一个周期需要计数 66666 次(1M/15=66666),TIM1 最大计数有65536,无法捕获 //5. 滤波频率:经历几个周期相同的跳变则波形稳定,此处不滤波。如果频率捕获偶发值不对,那么可以启用 0x02(4个事件) TIM1_PWMIConfig(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV1, 0x02); // 选择输入触发源 // 设置 TI1FP1 的信号为触发输入源 // 芯片根据触发源的// stm8s_it.cINTERRUPT_HANDLER(TIM1_CAP_COM_IRQHandler, 12){ // 初始化 u16 icValueB, icValueC; // 中断:PWM 捕获 //【经过实际测试】复位触发模式的第一个上升沿不会触发中断,第一个下降沿和第二个上升沿会触发中断 //实际编码过程中,我们只需要关注第二个上升沿中断就可以了,其他动作STM8库函数会自动处理。 if( TIM1_GetITStatus(TIM1_IT_CC1) != RESET ){ // B 点:第一个下降沿的计数器值(TIM1 CH2) // C 点:第二个上升沿的计数器值(TIM1 CH1) icValueB = TIM1_GetCapture2(); icValueC = TIM1_GetCapture1(); // 计算频率和周期 // 这里的 1000000 是基于初始化函数中的系统时钟设置(16预分频 = 1000000) // 这里的 100.0 小数点表示将表达式 icValueB*100.0/icValueC 的过程和结果以浮点数来进行 GV_Tim1PwmiFreq = 1000000/icValueC; GV_Tim1PwmiDuty = icValueB*100.0/icValueC; // 清除中断标志位 TIM1_ClearITPendingBit(TIM1_IT_CC1); TIM1_ClearFlag(TIM1_FLAG_CC1); }}我看不懂额c语言我是入门级,有易懂的吗?你去抖音搜一下有视频教程吗你不会吗?嗯 不好意思