写总结、聊职场,赢大疆无人机、红米平板、华为耳机、京东卡!参与《年末写总结、聊职场》活动,分享过去的电子从业经历,亦或是总结一下自己的2023。 主控制器采用Cortex-M3内核的STM32F103。控制器内部共有8个定时器,其中TIM1_CH1和TIM8_CH1为高级控制定时器引脚,TIM1_CH1用于电机编码器计数。TLM8_CH1用于舵机控制基准时间。通用定时器引脚TIM2 CH1、TIM3 CH1、TIM4_CH1、TIM5_CH1分别用于电机和舵机驱动电路上下桥壁PWM的产生。触发EXIT0中断的PA0口和PB0口分别用于电机过流中断保护。 #include 'pwm.h' void TIM1_Int_Init(u16 arr, u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = arr; //当定时器从0计数到999,即为1000次,为一个定时周期 TIM_TimeBaseStructure.TIM_Prescaler = psc; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分频系数:不分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; //设置切换值,当计数器计数到这个值时,发生电平切换。 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时,产生高电平 TIM_OC1Init(TIM1, &TIM_OCInitStructure); //启用通道1 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; //设置切换值,当计数器计数到这个值时,发生电平切换 TIM_OC2Init(TIM1, &TIM_OCInitStructure); //启用通道2 TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM1, ENABLE); // 使能TIM1重载寄存器ARR TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE); } ◆要求电机转速连续可调并且具有良好的静、动态性能,转速没计采用PI算法调节; ◆要求机器人快速到达指定角度,有位置反馈作为电机给定转速的调整; ◆具有一定的故障保护功能。当电机出现堵转、电流过大以及舵机触动限位开关时,要求停止驱动模块工作。 1)启动任务。对系统进行初始化,创建初始电机状态,然后自我删除,启动任务进入睡眠状态。 2)电机和舵机保护任务。用于在过流或限位开关动作时响应外部中断,进入中断状态通过发任务信号量,任务程序检测信号量有效并响应该任务,停止输出。任务优先级设为0级。 3)上位机给定任务。用于上位机控制电机和舵机,任务优先级设为1级。上位机数据输入寄存器时将产生一个中断,该中断将收到的字节送入缓冲区并释放上位机给定任务的信号量;任务中检测到信号量有效便开始执行,将对应的字节信息解析成对应的电机转速和舵机转角位置信息给相应变量赋值。 4)电机转速控制任务。用于电机的闭环调速,任务优先级设为2级。 5)舵机控制任务。用于控制舵机在规定时间内到达指定位置,任务优先级设为3级。 作者:abner_ma, 来源:面包板社区
|
|