你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f7脈波控制

[复制链接]
nickyliu6 提问时间:2018-2-7 09:56 /
各位先進好,目前在學習stm32f7,自從stm出了HAL庫後,許多網上的範例已經無法使用,想將下面的程式改為stm32f7可以使用的版本,請問該如何修改??


int main()
{         
        TIM_OPMGATE_Init();
        while(1)
        {        
                Motor_Control(500,10); //500us,10个脉冲
        }
}

void TIM_OPMGATE_Init()
{        
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        TIM_OCInitTypeDef TIM_OCInitStruct;
        GPIO_InitTypeDef  GPIO_InitStruct;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);//使能PC,PA端口时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3,ENABLE);//使能定时器23的时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用IO时钟        
        GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);        
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;                        
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStruct);        
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
        GPIO_Init(GPIOC,&GPIO_InitStruct);
        
       //TIM2工作在单脉冲下
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
        TIM_TimeBaseInitStruct.TIM_Prescaler = 7199;//预分频值,每100us计数一次
        TIM_TimeBaseInitStruct.TIM_Period = 99; //重装值,决定单脉冲周期
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);        
        
        TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);//设置TIM2在单脉冲模式,且是单一的脉冲,在下一个更新事件停止         
        TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC1Ref); //OC1REF signal is used as the trigger output (TRGO).单一模式不需要设置
        
        TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);//使能定时器2的通道1预装载寄存器
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//在向上计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//OC1输出使能
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高
        TIM_OCInitStruct.TIM_Pulse = 20;//比较捕获1的预装载值,决定单脉冲占空比,这个20就是低电平延续的来源
        TIM_OC1Init(TIM2,&TIM_OCInitStruct);               
        TIM_Cmd(TIM2,DISABLE); //Enable the TIM Counter
        
        //TIM3工作在从模式门控模式下
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
        TIM_TimeBaseInitStruct.TIM_Prescaler = 719;//预分频值,10us计数一次
        TIM_TimeBaseInitStruct.TIM_Period = 29;//重装值,决定PWM周期
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
        
        TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Gated);//TIM3为门控模式        
        TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);//使能TIM3的主从模式        
        TIM_SelectInputTrigger(TIM3,TIM_TS_ITR1);//内部触发,TIM_TS_ITR1对应TIM2

        TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能定时器3的通道1预装载寄存器
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//在向上计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//OC1输出使能
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高
        TIM_OCInitStruct.TIM_Pulse = 15;//比较捕获1的预装载值,占空比为50%
        TIM_OC1Init(TIM3,&TIM_OCInitStruct);
        TIM_Cmd(TIM3,ENABLE);//使能TIM3
}


收藏 评论14 发布时间:2018-2-7 09:56

举报

14个回答
努力的人 回答时间:2018-2-7 10:09:00
标准库与HAL库不一样,只有重写,或者使用CUBE来生成工程,不知道你用F7的哪一个型号,正点原子有HAL库的教程,你可以看一下

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wenyangzeng 回答时间:2018-2-7 11:47:50
本帖最后由 wenyangzeng 于 2018-2-7 11:49 编辑

F7不支持标准库,只能有HAL库,除非楼主把所有操作直接用修改寄存器方式。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

nickyliu6 回答时间:2018-2-7 14:08:23
努力的人 发表于 2018-2-7 10:09
标准库与HAL库不一样,只有重写,或者使用CUBE来生成工程,不知道你用F7的哪一个型号,正点原子有HAL库的教 ...

我使用的是f767 ZI的開發板正點原子的範例我有看過,但像单脉冲模式的部份函式設定,由於沒有做太多介紹所以還不太知道怎麼用
回答时间:2018-2-7 14:58:52
定时器配置好移植,两个参数定义名字差不多。主要是Motor_Control这里的操作。我没有用过motor的驱动,楼主可以试着改一下。有问题大家一起讨论。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

nickyliu6 回答时间:2018-2-7 15:14:30
安 发表于 2018-2-7 14:58
定时器配置好移植,两个参数定义名字差不多。主要是Motor_Control这里的操作。我没有用过motor的驱动,楼主 ...

目前我有大概改了一下,還有些找不到對應的函數,我有紅色標示,還請網上的高人指點

void TIM_OPMGATE_Init(void)
{       
        TIM_HandleTypeDef TIM2_Handler;         //
  TIM_OC_InitTypeDef TIM2_CH1Handler;
        GPIO_InitTypeDef  GPIO_InitStruct;

        __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_GPIOC_CLK_ENABLE();
        __HAL_RCC_TIM2_CLK_ENABLE();
        __HAL_RCC_TIM3_CLK_ENABLE();
        __HAL_RCC_AFIO_CLK_ENABLE();
       

        GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE;       

        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //¼Ò¦¡³]¸m
        GPIO_InitStruct.Pin = GPIO_PIN_0;                        //«ü©wIO¤f
        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;  //³t«×³]¸mhigh¥i½Õ¾ã
        GPIO_Init(GPIOA,&GPIO_InitStruct);       
        GPIO_InitStruct.Pin = GPIO_PIN_6;
        GPIO_Init(GPIOC,&GPIO_InitStruct);  


        //TIM2
       
        TIM2_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
        TIM2_Handler.Init.Prescaler = 7199;                               
        TIM2_Handler.Init.Period= 99;                                        
        HAL_TIM_PWM_Init(&TIM2_Handler);



        TIM_SelectOnePulseMode(TIM2,TIM_OPMODE_SINGLE);                 
        TIM_SelectOutputTrigger(TIM2,TIM_TRGO_OC1REF);

        //TIM2
        TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);       
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;               
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;       
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;       
        TIM_OCInitStruct.TIM_Pulse = 20;       
        TIM_OC1Init(TIM2,&TIM_OCInitStruct);               
        TIM_Cmd(TIM2,DISABLE); //Disable the TIM Counter

  
        //TIM3
        TIM3_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
        TIM3_Handler.Init.Prescaler = 719;
        TIM3_Handler.Init.Period = 29;       
        HAL_TIM_PWM_Init(&TIM3_Handler);
       

        TIM_SelectSlaveMode(TIM3, TIM_SLAVEMODE_GATED);
        TIM_SelectMasterSlaveMode(TIM3,TIM_MASTERSLAVEMODE_ENABLE);
        TIM_SelectInputTrigger(TIM3,TIM_TS_ITR1);
        TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitStruct.TIM_Pulse = 15;
        TIM_OC1Init(TIM3,&TIM_OCInitStruct);
        TIM_Cmd(TIM3,ENABLE);

}
回答时间:2018-2-7 15:23:46
楼主看一下HAL_TIM_OC_ConfigChannel这个函数,如果不会用了,在下面类似的路径下有对应oc的例程,我对motor这些不是很熟悉,不确定要用哪个oc功能。
C:\Users\user\STM32Cube\Repository\STM32Cube_FW_F4_V1.16.0\Projects\STM324xG_EVAL\Examples\TIM
Tcreat 回答时间:2018-2-7 17:58:59
对于红色部分 楼主可以根据标准库对这些函数的注解先弄明白标准库下程序要做什么  然后再通过HAL库的相关函数的注解 来选择相关的配置函数  

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

努力的人 回答时间:2018-2-7 20:26:33
nickyliu6 发表于 2018-2-7 14:08
我使用的是f767 ZI的開發板正點原子的範例我有看過,但像单脉冲模式的部份函式設定,由於沒有做太多介紹 ...

输出PWM,原子哥有例程的,互补PWM的火哥有
xuanyuan1993 回答时间:2018-2-7 22:09:22
厉害死厉害,学习了

评分

参与人数 1ST金币 -1 收起 理由
zero99 -1 问题帖严禁灌水

查看全部评分

12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版