完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
环境说明:
控制器:STM32F101R8T6 STM32主题库 版本:V3.5驱动芯片:AMIS-30542关键电机电机:2相控制器电机 原理图:AMIS30542电机 地址宏定义: #define MOTOR_WR 0x00 #define MOTOR_CR0 0x01 #define MOTOR_CR1 0x02 #define MOTOR_CR2 0x03 #define MOTOR_SR0 0x04 #define MOTOR_SR1 0x05 #define MOTOR_SR2 0x06 #define MOTOR_SR3 0x07 #define MOTOR_CR3 0x08 SPI接口及DIR/STEP最终: /***************************************************** ****************************************************** ****** ** 函数名称: SPI_Init_Enable ** 功能描述: SPI1初始化 ** 输入: 无 ** 输出: 无 **部门变量: 无 ** 调用模块: SPI_InitStructure,GPIO_InitTypeDef,SPI_Cmd ** **------------------------------------------------ -------------------------------------------------- ----- ** 修改人: **日期: **------------------------------------------------ -------------------------------------------------- ---- ****************************************************** ****************************************************** ****/ void SPI1_Init(无效) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* 启用 SPI1 GPIO 时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC,使能); /* 配置 SPI1 引脚:NSS,SCK,MISO 和 MOSI */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_0); //DIR/Step 管脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3《span style="font-family: Arial, Helvetica, sans-serif;"》;《/span》 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_2); //CLR置低 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); SPI_Cmd(SPI1,禁用); /* 将 PB.02 配置为输出推挽,用作片选 */ /* SPI1 配置 */ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); // SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE | SPI_I2S_IT_TXE,使能); SPI_Cmd(SPI1,使能); } void Write_SPI_One_Byte(unsigned char addr,unsigned char data) { GPIO_ResetBits(GPIOA,GPIO_Pin_4); //SPI_delay(500); SPI_I2S_SendData(SPI1,0x80|addr); 而(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET); 而(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET); SPI_I2S_ReceiveData(SPI1); SPI_I2S_SendData(SPI1,数据); 而(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET); 而(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET); SPI_I2S_ReceiveData(SPI1); GPIO_SetBits(GPIOA,GPIO_Pin_4); //SPI_delay(500); } AMIS-30542 初始化配置:参数配置电影参考......详见其数据手册 这里设置了聚焦一周1/8,则须为360度刻印数:20 * 8 = 1600,其中200为步进电机的固定参数:步运行一周须要200个整装...... ………………接口接口 工做流量大小设置...... void MotordevInit(void) { //CLR复位 GPIO_SetBits(GPIOC,GPIO_Pin_3); SPI_delay(1000); GPIO_ResetBits(GPIOC,GPIO_Pin_3); Write_SPI_One_Byte(MOTOR_WR,0x00);//关闭看门狗 SPI_delay(1000); Write_SPI_One_Byte(MOTOR_CR0,0x40);//1/8Micro-Step,电流=1.39A SPI_delay(1000); Write_SPI_One_Byte(MOTOR_CR1,0x84);//DIRCTRL = 1,NXTP = 0,PWMF = 0,PWMJ = 1, EMC = VERY FAST SPI_delay(1000); Write_SPI_One_Byte(MOTOR_CR2,0xA0);//MOTEN = ENABLE MOTOR DRIVER,SLP = 禁用休眠模式,Gain = 0.25,SLA 透明 SPI_delay(1000); Write_SPI_One_Byte(MOTOR_CR3,0x84);//模式1' 4个PWM周期75%占空比4个PWM周期 SPI_delay(1000); } TIMER1定时器初始化:中断模式,用于NXT的语句发出ip void TIM_Configuration1(void)//TIM初始化函数 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //TIM基本事件结构体 TIM_OCInitTypeDef TIM_OCInitStructure; //TIM 输出控制结构体 NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//使能TIM 钟 TIM_DeInit(TIM1); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_OCStructInit(&TIM_OCInitStructure); TIM_TimeBaseStructure.TIM_Prescaler = 449; //TIM预分频160KHz TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM计数模式 TIM_TimeBaseStructure.TIM_Period = 799; //TIM计数周期 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //TIM 钟分频 TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); // TIM_SelectOnePulseMode(TIM1,TIM_OPMode_Repetitive); // 连续输出 TIM_ARRPreloadConfig(TIM1,启用);//PWM周期预加载 TIM_Cmd(TIM1,禁用);//使能TIM1 NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQChannel; //更新事件 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd = 启用;//捕捉中断 NVIC_Init(&NVIC_InitStructure); //写入设置 TIM_ITConfig(TIM1,TIM_IT_Update,DISABLE); } 其他的I/O初始化配置,略过...... 电机部分函数:io 使能: void EnableMotor(无效) { //重置EN; Write_SPI_One_Byte(MOTOR_CR2,0xA0); } 调速: void MotorChangeFreq(浮动频率) { TIM1-》ARR=给个值...... } 运行: void MotorRun(unsigned char Dir,u16 freq) { 使能电机(); TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);//使能中断 TIM1-》ARR=频率; TIM_Cmd(TIM1,启用); ………… ………… } 中止: 将TIM中断禁止了就结束了...... ………………………… 中断函数: /***************************************************** ********************************/ /* STM32F10x 外设中断处理程序 */ /***************************************************** ********************************/ /** * @brief 该函数处理 TIM1 全局中断请求。 * @param 无 * @retval 无 */ void TIM1_UP_IRQHandler(无效) { 如果(TIM_GetITStatus(TIM1,TIM_IT_Update)!= RESET) { 如果(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_3)==0) { GPIO_SetBits(GPIOA,GPIO_Pin_3); ………… ………… } 别的 { GPIO_ResetBits(GPIOA,GPIO_Pin_3); } } TIM_ClearFlag(TIM1,TIM_FLAG_Update); TIM_ClearITPendingBit(TIM1,TIM_IT_Update); } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1632 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1559 浏览 1 评论
985 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1605 浏览 2 评论
1869浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
652浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
522浏览 3评论
539浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
508浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 11:42 , Processed in 0.840216 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号