AT8236控制代码

AT8236控制代码与电机转动实践
本文档详细介绍了使用AT8236进行电机控制的相关配置,包括motor.c、motor.h和main.c的设置。霍尔传感器部分的配置虽可忽略,但已验证其不影响电机正常转动,确保了电机的平稳运行。

关于AT8236不得不看的一些配置说明。

motor.c配置

#include "motor.h"
#include "adc.h"
#include "stm32f0xx_tim.h"
#include "stm32f0xx_exti.h"
#include "stm32f0xx_syscfg.h"

//#include "stdlib.h"
u16 motor_curret;
//u8 couter1,couter2;
u8 flag;
//uint16_t TimerPeriod = 255;
//uint16_t Channel1Pulse = 0, Channel2Pulse = 0, Channel3Pulse = 0, Channel4Pulse = 0,Channel5Pulse = 0;
//motor的初始化
 u32 couter1=0;
void motor_Inint_PWM1(uint16_t  ChannelPulse)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin =PWM1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_2);
	
	TIM_DeInit(TIM2);
  /* TIM1 counter enable */
  TIM_Cmd(TIM2, ENABLE);
//  
  /* Time Base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
//  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  /* Channel 1, 2, 3 and 4 Configuration in PWM mode */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
//  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
//  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

  TIM_OCInitStructure.TIM_Pulse = (uint16_t ) ChannelPulse;
  TIM_OC3Init(TIM2, &TIM_OCInitStructure);

	  /* TIM1 Main Output Enable */
  TIM_CtrlPWMOutputs(TIM2, ENABLE);
}

void motor_Inint_PWM2(uint16_t  ChannelPulse)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin =PWM2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_2);
	
	TIM_DeInit(TIM2);
  /* TIM1 counter enable */
  TIM_Cmd(TIM2, ENABLE);
//  
  /* Time Base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
//  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  /* Channel 1, 2, 3 and 4 Configuration in PWM mode */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
//  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
//  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

  TIM_OCInitStructure.TIM_Pulse = (uint16_t ) ChannelPulse;
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);

	  /* TIM1 Main Output Enable */
  TIM_CtrlPWMOutputs(TIM2, ENABLE);
}

void motor_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

		///////电机电源开关
	GPIO_DeInit(GPIOA);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA,GPIO_Pin_7);////电机电源开关
	
	//故障检测脚,故障时为低电平欠压//欠压锁定 (UVLO)、 过流保护 (OCP) 和热关断 (TSD)
	GPIO_InitStructure.GPIO_Pin = Motor_nFAULT_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_UP;//内部上拉
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA,GPIO_Pin_5);////电机故障检测
  ///霍尔检测
//	GPIO_InitStructure.GPIO_Pin = HALL_S_PIN;
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
//	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//	GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_UP;//内部上拉
//	GPIO_Init(GPIOA, &GPIO_InitStructure);
//	GPIO_SetBits(GPIOA,HALL_S_PIN);////hall检测
//	
}

void EXTI4_Config(void)
{
  EXTI_InitTypeDef   EXTI_InitStructure;
  GPIO_InitTypeDef   GPIO_InitStructure;
  NVIC_InitTypeDef   NVIC_InitStructure;
  
  /* Enable GPIOA clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  /* Enable SYSCFG clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  /* Configure PA0 pin as input floating */
  GPIO_InitStructure.GPIO_Pin = HALL_S_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(EXTI_HALL, &GPIO_InitStructure);
//  GPIO_PinAFConfig(GPIOA,GPIO_PinSource4,GPIO_AF_4);

//  
  /* Connect EXTI0 Line to PA0 pin */
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource4);

  /* Configure EXTI0 line */
  EXTI_InitStructure.EXTI_Line = EXTI_Line4;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

  /* Enable and set EXTI0 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel =EXTI4_15_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x02;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}


//*******正转****/////
void Forward_motor(uint16_t ChannelPulse)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
	GPIO_InitStructure.GPIO_Pin =PWM2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	PWM2_LOW;
	motor_Inint_PWM1(ChannelPulse);
}

//*******反转****/////
void Rev_motor(uint16_t ChannelPulse)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
	GPIO_InitStructure.GPIO_Pin =PWM1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	PWM1_LOW;
	motor_Inint_PWM2(ChannelPulse);
	
}

//*******刹车****/////
void Break_motor(void)
{
	PWM2_HIGHT;
	PWM1_HIGHT;
}
//故障检测
void Motor_nFAULT(void)
{
	//if()
		Motor_power_OFF;
}

void EXTI4_15_IRQHandler(void)
{
			
//		 flag=0;
    if (EXTI_GetITStatus(EXTI_Line4) != RESET) {    
			 
//			 flag++;
        EXTI_ClearITPendingBit(EXTI_Line4);// Clear the EXTI line pending bit
			  couter1++;
    }   

}




motor.h配置

#ifndef __motor_H
#define __motor_H

#include "stm32f0xx.h"

//-----------------电机端口定义---------------- 

#define PWM1_LOW          GPIO_ResetBits(GPIOA,GPIO_Pin_2)
#define PWM1_HIGHT        GPIO_SetBits(GPIOA,GPIO_Pin_2)


#define PWM2_LOW          GPIO_ResetBits(GPIOA,GPIO_Pin_1)
#define PWM2_HIGHT        GPIO_SetBits(GPIOA,GPIO_Pin_1)

#define Motor_power_ON    GPIO_SetBits(GPIOA,GPIO_Pin_10)
#define Motor_power_OFF   GPIO_ResetBits(GPIOA,GPIO_Pin_10)

#define Motor_nFAULT_PIN   GPIO_Pin_5

#define PWM1 							 GPIO_Pin_2 
#define PWM2  						 GPIO_Pin_1 
#define HALL_S_PIN				 GPIO_Pin_4
#define  EXTI_HALL   	   	GPIOA

#define   Hall_Read      	GPIO_ReadInputDataBit(GPIOA,HALL_S_PIN)

//#define TimerPeriod  255;



#define	 TimerPeriod  		((SystemCoreClock / 100 ) - 1)

#define ChannelONEPulse  (uint32_t) 5 * (TimerPeriod - 1)
  /* Compute CCR1 value to generate a duty cycle at 50% for channel 1 */
#define  Channel1Pulse  (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10)
  /* Compute CCR2 value to generate a duty cycle at 37.5%  for channel 2 */
#define  Channel2Pulse  (uint16_t) (((uint32_t) 375 * (TimerPeriod - 1)) / 1000)
  /* Compute CCR3 value to generate a duty cycle at 25%  for channel 3 */
#define  Channel3Pulse  (uint16_t) (((uint32_t) 25 * (TimerPeriod - 1)) / 100)
  /* Compute CCR4 value to generate a duty cycle at 12.5%  for channel 4 */
#define  Channel4Pulse  (uint16_t) (((uint32_t) 125 * (TimerPeriod- 1)) / 1000)

#define	 Channel5Pulse  (uint16_t) (((uint32_t) 75 * (TimerPeriod- 1)) / 1000)

void motor_Inint_PWM1(uint16_t  ChannelPulse);
void motor_Inint_PWM2(uint16_t  ChannelPulse);
void Rev_motor(uint16_t ChannelPulse);
void Forward_motor(uint16_t ChannelPulse);
//void Rev_motor(void);
void Break_motor(void);
//void Forward_motor(void);
void motor_Init(void);
void MotoStop(void);
void EXTI4_Config(void);
void Hall_Couter(void);
//void motor_Inint_PWM1(void);
//void motor_Inint_PWM2(void);
#endif

main.c 主测试函数

//////////////////////////////////////////////////////////////////////////////////	 
//2020-10-10生成
//2020-10-20 CAN HALL CAN 波形有尖峰输出波形不美丽
/*驱动测试完毕 **/

//******************************************************************************/
#include "stm32f0xx.h"
#include "stm32f0xx_dma.h"
#include "stm32f0xx_exti.h"
#include "can.h"
#include "stm32f0xx_can.h"
#include "delay.h"
#include "motor.h"
#include "GPIO_con.h"

#include "adc.h"
#include "timer.h"

__IO uint32_t ADC_12V = 0, ADC_ACCV = 0;
__IO uint16_t ADC_12_Votg[4];
//#include "oled.h"
//#include "bmp.h"
u16  *ADC_12V_Votg;
u16  *ADC_Votg;
u16 ADCValue[] = {0};
extern u32 couter1;
 u32 revcouter=0;
 u32 Forwardcouter=0;
u8 number;
extern u8 BAT_Vlt_flag;
extern u16 ADCConvertedValue_AVG[4];
//extern u8 flag;
//uint32_t  ADC_12_Votg;
//***开始标志***///
u8 begin_flag=0;
int main(void)
{
	int i=0;
	SystemInit();
	gpio_con_Init();
  delay_init();
  motor_Init();
	CAN_init();
	EXTI4_Config();
	EXTI_GenerateSWInterrupt(EXTI_Line4);
//  Rev_motor(ChannelONEPulse);
	ADC1_CH_DMA_Config();	
	ADC_DATA_AVG();
	can_tx(0X55,0X77); 
	Break_motor();
//	}
	/**工作原理先自检,电压,电流,判断hall位置开始正转,直到转到底,卡住**测试:命令控制*/

//时间上需要460S	
  while (1)
  {

//				   Rev_motor(ChannelONEPulse);
		//test
		Forward_motor(ChannelONEPulse);
//			Forward_motor(ChannelONEPulse);
			delay_ms(460);
			Break_motor();
			delay_ms(460);

   Rev_motor(ChannelONEPulse);
	    delay_ms(460);
		  Break_motor();
		  delay_ms(460);
				//test
	}
}

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

说明:霍尔传感器部分的设置可忽略,这个是判断电机转动圈数的参数。均测试已通过。电机可以正常转动

电机转动

<think>嗯,用户需要找AT8236驱动相关的代码示例。之前的对话历史中提到过鸿蒙HDF驱动开发、STM32超声波驱动,还引用了错误代码枚举的定义,但用户当前的需求非常明确——需要AT8236的具体实现。用户可能正在开发电机控制项目,AT8236作为三相无刷电机驱动芯片,常见于无人机、机器人等场景。ta提到"驱动程序代码"和"实现示例",说明需要可参考的底层寄存器操作或API封装案例。不过从引用内容看,用户似乎混淆了AT8236(电机驱动)和AT89C52(单片机)的型号。在技术层面,AT8236驱动需要关注几个核心功能:PWM信号生成(需精确控制死区时间)、高低侧MOSFET驱动逻辑、过流保护机制等。参考之前用户提到的STM32SysTick配置,推测ta可能希望获得类似的外设寄存器级操作代码。官方渠道应该是首要推荐,比如英飞凌(原Atmel)的应用笔记。但考虑到用户需要现成示例,开源平台比博客更可靠,GitHub上Arduino和STM32的驱动库比较成熟。特别要注意的是,不同微控制器平台的实现差异较大(如STM32的HAL库和STM8的寄存器操作完全不一样),需要用户明确开发环境。用户提供的站内引用其实无关当前需求:鸿蒙HDF驱动属于操作系统级框架,错误枚举定义是业务逻辑,但超声波驱动代码的结构可以参考——即分成初始化配置、核心功能函数、中断处理三部分。这个结构同样适用于电机驱动。意外发现用户之前接触过Seata分布式事务,或许ta的项目涉及物联网设备集群控制?但当前焦点还是驱动实现,这个联想暂时保留。</think> 以下是针对**AT8236芯片驱动开发**的综合建议与资源参考。AT8236是一款三相无刷直流(BLDC)电机驱动芯片,广泛应用于消费电子和工业控制领域,其驱动程序需重点关注电机控制时序、PWM信号配置和保护机制。 --- ### **一、核心开发资源** 1. **官方文档(关键)** - [Infineon AT8236 Datasheet](https://www.infineon.com/dgdl/Infineon-AT8236-DS-v01_00-EN.pdf?fileId=5546d4625e87ea5f015eb4e1b5b16e0d) 重点章节:寄存器映射(第8章)、PWM控制逻辑(第5章)、故障保护机制(第7章) 2. **开源实现参考** - **GitHub STM32驱动库** [STM32-BLDC-Controller](https://github.com/vedderb/bldc)(使用AT8236兼容方案) 关键文件:`bldc_driver.c` 中的 PWM 相位控制函数: ```c void TIM1_PWM_Init(uint16_t freq) { // 配置高级定时器TIM1为互补PWM输出 TIM_OC_InitTypeDef oc = {0}; oc.OCMode = TIM_OCMODE_PWM1; oc.Pulse = 0; // 初始占空比0% HAL_TIM_PWM_ConfigChannel(&htim1, &oc, TIM_CHANNEL_1); HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1); // 启动互补通道 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty_cycle); // 动态更新占空比 } ``` 3. **硬件连接参考** | AT8236引脚 | 微控制器接口 | 作用 | |------------|--------------|------| | `INHx`/`INLx` | PWM输出 | 高/低侧驱动 | | `nFAULT` | 外部中断 | 过流/过热保护 | | `VREF` | DAC输出 | 电流限制阈值 | --- ### **二、关键实现步骤** 1. **初始化配置** ```c void AT8236_Init(void) { // 1. 使能PWM定时器(中心对齐模式) PWM_Timer_Config(20000); // 20kHz PWM频率 // 2. 配置硬件保护中断 HAL_GPIO_Init(FAULT_GPIO_PORT, &GPIO_InitStruct); HAL_NVIC_SetPriority(EXTIx_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTIx_IRQn); // 3. 设置电流检测基准电压(使用DAC) HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 800); // 0.5V } ``` 2. **电机换相逻辑** ```c void Motor_Commutation(uint8_t step) { // 六步换向表 (对应0-5相位) static const uint8_t phase[6][3] = { {1,0,0}, {1,1,0}, {0,1,0}, {0,1,1}, {0,0,1}, {1,0,1} }; HAL_GPIO_WritePin(GPIOA, INHA_Pin, phase[step][0]); HAL_GPIO_WritePin(GPIOB, INHB_Pin, phase[step][1]); HAL_GPIO_WritePin(GPIOC, INHC_Pin, phase[step][2]); } ``` 3. **故障中断处理** ```c void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == FAULT_Pin) { PWM_Stop(); // 立即关闭PWM输出 Error_Handler(); } } ``` --- ### **三、调试建议** 1. **示波器检测点** - 测量PWM信号死区时间(典型值 ≥ 500ns) - 检查`nFAULT`触发时的电流波形 2. **常见问题排查** - **电机抖动**:检查换向时序是否匹配霍尔信号 - **过流保护误触发**:调整VREF电压或检测电阻阻值 - **发热异常**:降低PWM频率至10kHz以下 --- ### **四、扩展资源** - **应用笔记** [AN1114:使用AT8236驱动无人机电机](https://www.infineon.com/dgdl/Infineon-AN1114_Brushless_DC_Motor_Drive-ApplicationNotes-v01_00-EN.pdf)(含PCB布局指南) ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值