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

免费做网站可以一直用吗辽宁省品牌建设促进会网站

免费做网站可以一直用吗,辽宁省品牌建设促进会网站,企业网站建设的基本内容,网页设计意图怎么写1.定时器功能介绍#xff1a; 在控制领域里面#xff0c;我们可以用信号输出定时器#xff0c;进行PWM的控制#xff0c;从而达到控制电机的目的#xff0c;通过输入捕获功能可以用来接收外部的数字信号#xff0c;用于测量脉冲宽度、频率或周期等。在这里给大家介绍下 在控制领域里面我们可以用信号输出定时器进行PWM的控制从而达到控制电机的目的通过输入捕获功能可以用来接收外部的数字信号用于测量脉冲宽度、频率或周期等。在这里给大家介绍下具体用定时器做计数输出和捕获的功能实现。 STM32F4一共有三种14个定时器。(12个16位的2个32位的)STM32F1系列只有8个16位的。 高级定时器TIM1、TIM8。通常用于特定领域和专业需求用户使用的精密计时工具通常适用于需要精度更高的领域。通常可以精确到毫秒或更小的时间单位并具有更复杂的逻辑和算法。 通用定时器TIM2、TIM5、TIM3、TIM4TIM9~TIM14。  基本定时器TIM6、TIM7没有捕获等通道用作简单定时。 STM32通用定时器可以被用于测量输入信号的脉冲长度输入捕获或者产生输出波形输出比较和PWM等。 2.计数定时器配置 在STM32F429上实现TIM6的计时可以通过以下步骤进行 使能TIM6时钟。 初始化TIM6时基单元设置时钟分频系数和计数周期。 使能更新中断如果需要。 使能TIM6。 等待中断处理如果使能了中断。 以下是一个简单的示例代码展示如何使用HAL库函数来配置TIM6作为一个简单的计时器 /* 注意1. 中断相关名称。注意基本定时器TIM6 的中断名为 TIM6_DAC_IRQn TIM6 global and DAC12 underrun error interrupts其他一些定时器为 TIMx_IRQn(x2,3,4,7 etc) */ /* 中断函数名为 TIM6_DAC_IRQHandler()而不是 TIM6_IRQHandler() */ /* 3. 基本定时器(TIM6, TIM7)通用定时器高级定时器(TIM1, TIM8)功能越来越多此处只做个简单计时基本定时器足够了 */#include timer.huint32_t tim 0; // 全局变量每0.1ms加1 TIM_HandleTypeDef TIM6_Handler; //定时器句柄 /* 基本定时器6初始化 */ /* 实现 0.1ms 计时中断 */ /* 90M/901M1M/100 10kHz 0.1ms */ void TIM6_Init(void) { TIM_MasterConfigTypeDef sMasterConfig {0};TIM6_Handler.Instance TIM6; // 基本定时器TIM6_Handler.Init.Prescaler 180-1; // 分频系数 180MHz得到 180M/1801M 时钟TIM6_Handler.Init.CounterMode TIM_COUNTERMODE_UP; // 向上计数器TIM6_Handler.Init.Period 100-1; // 自动装载值 100每 100/1M 100us0.1ms中断一次htim7.Init.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_ENABLE;HAL_TIM_Base_Init(TIM6_Handler);sMasterConfig.MasterOutputTrigger TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(htim6, sMasterConfig) ! HAL_OK){Error_Handler();}HAL_TIM_Base_Start_IT(TIM6_Handler); //使能定时器3和定时器3更新中断TIM_IT_UPDATE } /* 定时器底册驱动开启时钟设置中断优先级 */ /* 此函数会被HAL_TIM_Base_Init()函数调用 */ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) {if(htim-InstanceTIM6){__HAL_RCC_TIM6_CLK_DISABLE(); // 使能TIM6时钟HAL_NVIC_SetPriority(TIM6_IRQn,1,3); // 中断优先级抢占优先级1子优先级3。HAL_NVIC_EnableIRQ(TIM6_IRQn); // 开启ITM6中断 } }/*** brief 定时器比较中断* param htim定时器句柄指针* note 无* retval 无*/ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {if(__HAL_TIM_GET_IT_SOURCE(TIM6_Handler, TIM_IT_UPDATE) !RESET){__HAL_TIM_CLEAR_IT(TIM6_Handler, TIM_IT_UPDATE); // 清除中断标志位}tim ; // 又是0.1ms全局时间计数加1 }3.TIM3输出4路PWM波 与定时不同配置输出PWM波需要配置I/O口相应地需要配置相应通道输出PWM波时可不配置中断。步骤如下 初始化配置。选择时钟、配置分频系数、计数模式、自动重装值、分频因子。 通道配置。配置PWM模式、默认占空比、输出比较极性并且开启对应的通道。 底层配置。开启时钟、配置相关引脚。 此处航模电机驱动频率选择常用的 400Hz定时器重装值选择 5000-1。为了方便实际中调节各个电机的占空比编写设置于获取占空比的函数占空比调节精度为 1/1000。 对于I/O选择使用了TIM3 CH1~CH3对应引脚参考核心板原理图 #define PWM_PIN GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_0 | GPIO_PIN_1 #define PWM_GPIO GPIOB #define PWM_ENCLK() __HAL_RCC_TIM3_CLK_ENABLE(); \__HAL_RCC_GPIOB_CLK_ENABLE(); // 使能定时器3开启GPIOB时钟 /* 四个电机枚举 */ typedef enum {MOTOR1 0,MOTOR2 1,MOTOR3 2,MOTOR4 3 };/* TIM3 4路 PWM波输出初始化 */ void TIM3_PWM_Init(void) { TIM3_Handler.Instance TIM3; //定时器3TIM3_Handler.Init.Prescaler 45-1; //定时器分频 45得到 90M/452M 时钟TIM3_Handler.Init.CounterMode TIM_COUNTERMODE_UP; //向上计数模式TIM3_Handler.Init.Period 5000-1; //自动重装载值 5000得到PWM频率 2M/5k400HzTIM3_Handler.Init.ClockDivision TIM_CLOCKDIVISION_DIV1;HAL_TIM_PWM_Init(TIM3_Handler); //初始化PWMTIM3_CHxHandler.OCMode TIM_OCMODE_PWM1; //模式选择PWM1TIM3_CHxHandler.Pulse 0; //设置比较值,此值用来确定占空比默认为0TIM3_CHxHandler.OCPolarity TIM_OCPOLARITY_HIGH; //输出比较极性为高HAL_TIM_PWM_ConfigChannel(TIM3_Handler,TIM3_CHxHandler,TIM_CHANNEL_1); //配置TIM3通道1HAL_TIM_PWM_Start(TIM3_Handler, TIM_CHANNEL_1); //开启PWM通道1HAL_TIM_PWM_ConfigChannel(TIM3_Handler,TIM3_CHxHandler,TIM_CHANNEL_2); //配置TIM3通道2HAL_TIM_PWM_Start(TIM3_Handler, TIM_CHANNEL_2); //开启PWM通道2HAL_TIM_PWM_ConfigChannel(TIM3_Handler,TIM3_CHxHandler,TIM_CHANNEL_3); //配置TIM3通道3HAL_TIM_PWM_Start(TIM3_Handler, TIM_CHANNEL_3); //开启PWM通道3HAL_TIM_PWM_ConfigChannel(TIM3_Handler,TIM3_CHxHandler,TIM_CHANNEL_4); //配置TIM3通道4HAL_TIM_PWM_Start(TIM3_Handler, TIM_CHANNEL_4); //开启PWM通道4}/* 定时器底层驱动时钟使能引脚配置 */ /* 此函数会被HAL_TIM_PWM_Init()调用 */ void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) {GPIO_InitTypeDef GPIO_Initure;PWM_ENCLK();GPIO_Initure.Pin PWM_PIN; GPIO_Initure.Mode GPIO_MODE_AF_PP; // 复用推完输出GPIO_Initure.Pull GPIO_PULLUP; // 上拉GPIO_Initure.Speed GPIO_SPEED_HIGH; // 高速GPIO_Initure.Alternate GPIO_AF2_TIM3; // 引脚复用HAL_GPIO_Init(PWM_GPIO, GPIO_Initure); }/* 设置电机占空比 */ /* motor: 选择电机可填MOTOR1, MOTOR2, MOTOR3, MOTOR4 */ /* duty: 占空比为千分之 duty */ void SetMotorDuty(uint8_t motor, uint16_t duty) {if (duty 1000)duty 1000;else if (duty 0)duty 0;if (motor MOTOR1)TIM3-CCR1 duty * 5 - 1; // 由于计数器重装值ARR为 5000精度为千分之一故此处乘以5减一是因为从0开始计数else if (motor MOTOR2)TIM3-CCR2 duty * 5 - 1;else if (motor MOTOR3)TIM3-CCR3 duty * 5 - 1;else if (motor MOTOR4) TIM3-CCR4 duty * 5 - 1; }/* 获取电机占空比 */ /* motor选择电机可填MOTOR1, MOTOR2, MOTOR3, MOTOR4占空比为千分之返回值 */ uint16_t GetMotorDuty(uint8_t motor) {uint32_t cap_value;if (motor MOTOR1)cap_value HAL_TIM_ReadCapturedValue(TIM3_Handler,TIM_CHANNEL_1); // 读取比较寄存器的值else if (motor MOTOR2)cap_value HAL_TIM_ReadCapturedValue(TIM3_Handler,TIM_CHANNEL_1);else if (motor MOTOR3)cap_value HAL_TIM_ReadCapturedValue(TIM3_Handler,TIM_CHANNEL_1);else if (motor MOTOR4) cap_value HAL_TIM_ReadCapturedValue(TIM3_Handler,TIM_CHANNEL_1);return (cap_value1) / 5; } 4.TIM5输入捕获 输入捕获也需要配置对应的 I/O 口于通道而且需要在中断服务函数里实现定时中断、高/低电平时间的测量。步骤如下 1.初始化配置选择时钟、配置分配系数、计数模式、自动重装值、时钟分频因子。 2.通道配置配置上升/下降沿捕获、引脚对应寄存器、分频因子、滤波效果。 3.底层配置配置引脚、使能时钟、中断优先级与是能。 4.中断服务函数思想很简单分别读取下降沿、上升沿、下降沿时寄存器数据计算得到正脉宽、周期等参数。 #define CAP_PIN GPIO_PIN_0 #define CAP_GPIO GPIOA #define CAP_ENCLK() __HAL_RCC_TIM5_CLK_ENABLE(); \__HAL_RCC_GPIOA_CLK_ENABLE(); //使能TIM5时钟开启GPIOA时钟TIM_HandleTypeDef TIM5_Handler; //定时器5句柄uint32_t cap_value1 0; // 检测到上升沿时的计数 uint32_t cap_value2 0; // 检测到下降沿时的计数, cap_value2 - cap_value1 即为正脉冲时间 uint32_t cap_value3 0; // 再次检测到上升沿时的计数, cap_value3 - cap_value1 即为周期uint8_t cap_sta 0; // 输入捕获状态, 0:没有完成捕获去捕获边沿吧 1:捕获边沿完成去计算周期吧 uint8_t cap_times 0; // 捕获次数/* 定时器5通道1输入捕获配置 */ /* 频率90M/90/1 1MHz */ void TIM5_CH1_Cap_Init(void) { TIM_IC_InitTypeDef TIM5_CH1Config; TIM5_Handler.Instance TIM5; // 通用定时器5TIM5_Handler.Init.Prescaler 90-1; // 分频系数TIM5_Handler.Init.CounterMode TIM_COUNTERMODE_UP; // 向上计数器TIM5_Handler.Init.Period 0XFFFFFFFF; // 自动装载值TIM5_Handler.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; // 时钟分频银子HAL_TIM_IC_Init(TIM5_Handler); // 初始化输入捕获时基参数TIM5_CH1Config.ICPolarity TIM_ICPOLARITY_RISING; // 上升沿捕获TIM5_CH1Config.ICSelection TIM_ICSELECTION_DIRECTTI; // 设置引脚与寄存器关系。CH1、CH2用TI1CH3、CH4用TI2TIM5_CH1Config.ICPrescaler TIM_ICPSC_DIV1; // 配置输入分频不分频TIM5_CH1Config.ICFilter0; // 配置输入滤波器不滤波HAL_TIM_IC_ConfigChannel(TIM5_Handler,TIM5_CH1Config,TIM_CHANNEL_1);//配置TIM5通道1HAL_TIM_IC_Start_IT(TIM5_Handler,TIM_CHANNEL_1); // 开启TIM5的捕获通道1并且开启捕获中断__HAL_TIM_ENABLE_IT(TIM5_Handler,TIM_IT_UPDATE); // 使能更新中断 }/* 定时器5底层驱动时钟使能引脚配置 */ /* 此函数会被HAL_TIM_IC_Init()调用 */ void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) {GPIO_InitTypeDef GPIO_Initure;CAP_ENCLK();GPIO_Initure.Pin CAP_PIN; // 引脚GPIO_Initure.Mode GPIO_MODE_AF_PP; // 复用推挽输出GPIO_Initure.Pull GPIO_PULLDOWN; // 下拉GPIO_Initure.Speed GPIO_SPEED_HIGH; // 高速GPIO_Initure.Alternate GPIO_AF2_TIM5; // PA0复用为TIM5通道1HAL_GPIO_Init(CAP_GPIO,GPIO_Initure);HAL_NVIC_SetPriority(TIM5_IRQn,2,0); // 设置中断优先级抢占优先级2子优先级0HAL_NVIC_EnableIRQ(TIM5_IRQn); // 开启ITM5中断通道 }/* 定时器5中断服务函数 */ void TIM5_IRQHandler(void) {HAL_TIM_IRQHandler(TIM5_Handler); //定时器共用处理函数 }/* 定时器输入捕获中断处理回调函数该函数在HAL_TIM_IRQHandler中会被调用 */ void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) //更新中断溢出发生时执行 {if (cap_sta 0){switch (cap_times){case 0: // 清空一切准备捕获cap_value1 0;cap_value2 0;cap_value3 0;__HAL_TIM_DISABLE(TIM5_Handler); //关闭定时器5__HAL_TIM_SET_COUNTER(TIM5_Handler,0); TIM_RESET_CAPTUREPOLARITY(TIM5_Handler,TIM_CHANNEL_1); //一定要先清除原来的设置TIM_SET_CAPTUREPOLARITY(TIM5_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//定时器5通道1设置为下降沿捕获__HAL_TIM_ENABLE(TIM5_Handler);cap_times 1;break;case 1: // 捕获了一次cap_value1 HAL_TIM_ReadCapturedValue(TIM5_Handler,TIM_CHANNEL_1); // 读数一次TIM_RESET_CAPTUREPOLARITY(TIM5_Handler,TIM_CHANNEL_1); //一定要先清除原来的设置TIM_SET_CAPTUREPOLARITY(TIM5_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);//定时器5通道1设置为上升沿捕获 cap_times 2;break;case 2: // 捕获了两次cap_value2 HAL_TIM_ReadCapturedValue(TIM5_Handler,TIM_CHANNEL_1); // 读数一次TIM_RESET_CAPTUREPOLARITY(TIM5_Handler,TIM_CHANNEL_1); //一定要先清除原来的设置TIM_SET_CAPTUREPOLARITY(TIM5_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//定时器5通道1设置为下降沿捕获 cap_times 3;break;case 3: // 捕获了三次cap_value3 HAL_TIM_ReadCapturedValue(TIM5_Handler,TIM_CHANNEL_1); // 读数一次TIM_RESET_CAPTUREPOLARITY(TIM5_Handler,TIM_CHANNEL_1); //一定要先清除原来的设置TIM_SET_CAPTUREPOLARITY(TIM5_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING); //定时器5通道1设置为上升沿捕获cap_times 0; cap_sta 1; // 所有捕获完成可以去计算了break;}} }测试捕获和输出 void TestPwmTask(void *arg) {const uint16_t test_postime 100; // 正常时间为 test_postime / 1000 * 2500 test_postime * 2.5uint32_t pos_time; // 高电平时间uint32_t cycle; // 周期uint32_t freq; // 频率float pos_duty; // 正占空比SetMotorDuty(MOTOR1, test_postime); // 电机PWM 400Hz 2500 us占空比 100/1000高电平时间 250us SetMotorDuty(MOTOR2, test_postime);SetMotorDuty(MOTOR3, test_postime);SetMotorDuty(MOTOR4, test_postime);while(1){if (cap_sta 1) //成功捕获到了一次高电平{pos_time cap_value3 - cap_value2;cycle cap_value3 - cap_value1;freq (uint32_t)1000000 / cycle;pos_duty (float) pos_time / (float) cycle;printf(周期%d us\t 正脉冲宽%d us \r\n, cycle, pos_time);printf(频率%d Hz\t 正占空比%.2f %%\r\n\r\n, freq, pos_duty*100);cap_sta 0; // 搞完事情开启下一次捕获}delay_ms(200);} }
http://www.zqtcl.cn/news/28925/

相关文章:

  • 一个虚拟主机多个网站卓越职业院校建设专题网站
  • 网站维护说明网站设计概述
  • 自己的网站服务器wordpress 伪静态 nginx
  • 教育网站搭建软件开发公司简介怎么写
  • 做网站不要盲目跟风珠海建设企业网站的公司
  • 网站开发开什么票广州白云区
  • 免费企业网站建设免费服装网站怎么做
  • 国家建设部网站首页wordpress网站不安全
  • 百度做网站电话多少培训通网站建设
  • wordpress 管理员账号在哪里查询seo发包软件
  • 画册什么网站做方便seo还能赚钱吗
  • 网站开发与网页制作中国万网官网域名续费
  • 兴义网站建设网站建设百度怎么做公司的网站
  • 企业网站建设平台的功能怎样做网络推广为什么要做网络推广
  • 石家庄网站开发公司电话建设网站公司兴田德润在哪儿
  • 网站打开慢是什么原因合肥地区网站制作
  • 无锡网站优化排名推广知名网站建设推广
  • 网站后台的网址忘记了门店推广是什么意思
  • 珠海找工作哪个网站好重庆首页工程设计咨询有限责任公司
  • 什么是交互式网站开发中国建设信息化期刊官网
  • 制作网站电话网站推广公司排名点击查看
  • 网站产品使用说明书怎么做建设银行信用卡被钓鱼网站骗了15000
  • 买高端品牌网站建设wap微信网站模板
  • 支付宝网站设计分析中兴通讯的网站建设分析
  • 怎样建设个人手机网站wordpress标题设置
  • 上海企业免费建站深圳搜索优化排名
  • 慈溪企业网站建设帕绍网站建设
  • 如何做网站好看wordpress移动新闻
  • 网站如何能让百度收录网站建设柒首先金手指8
  • 网站备案信息管理wordpress 影视源码