这周比较忙都没什么时间玩板子,趁着今天下雪刚好可以继续熟悉一下电机控制部分。先前的帖子只是按照官方的例程稍作改动让电机能转起来。不过在实际的应用中我们肯定要进行一些速度控制,今天我们就用板载的电位器对电机进行速度控制。
使用到的外设有UART、CCU6、BDRV和ADC1,相关的寄存器配置如下:
这里我们可以选择不从相应的管脚输出波形,便于用串口来打印信息。
生成相应的代码之后,我的思路是通过调节板载电位器来控制占空比来达到调速的目的。AD转换mV输出的范围是0-5000,通过(uint16)1200*mV/5000)可以映射到0-1200,对应的占空比是0-100。然后通过串口发送字符'a''b'可以进行电机的换向。
main函数如下:
uint16 mV;
bool value_valid;
uint8 flag;
int main(void)
{
/*****************************************************************************
** initialization of the hardware modules based on the configuration done **
** by using the IFXConfigWizard **
*****************************************************************************/
SCU_Init();
Port_Init();
CCU6_Init();
Bdrv_Init();
UART2_Init();
INT_Init();
Adc1_Init();
VAREF_Enable();
/*****************************************************************************
** place your application code here **
*****************************************************************************/
/* check open load at the motor contacts */
if (Bdrv_Diag_OpenLoad() == true)
{
/* no motor detected */
printf(" 电机没有连接 ");
}
else
{
/* motor found */
printf(" 连接了一个电机 ");
// /* configure bridge to run PWM on Phase2 - forward */
Bdrv_Set_Bridge(Ch_En, Ch_On, Ch_PWM, Ch_PWM);
// /* backward */
// /* configure bridge to run PWM on Phase1 - backward */
// Bdrv_Set_Bridge(Ch_PWM, Ch_PWM, Ch_En, Ch_On);
}
printf("------------------------- ");
printf("Hi,this is a bdrv demo!!! ");
printf("------------------------- ");
while (1)
{
/***************************************************************************
** main watchdog1 (WDT1) service **
***************************************************************************/
/*lint -e534 Supressing MISRA 2012 MISRA 2012 Directive 4.7 */
WDT1_Service();
/*lint +e534 */
/***************************************************************************
** place your application code here **
***************************************************************************/
Delay_S(1000);
value_valid = Adc1_GetChResult_mV(&mV, ADC1_CH4);
if (value_valid == true)
{
if(flag == 0)
printf("电机正转 |");
else
printf("电机反转 |");
printf(" AD转换电压(mV) = %d | 占空比(%%) = %2d " ,mV,(uint16)mV/50);
CCU6_LoadShadowRegister_CC60((uint16)1200*mV/5000);
CCU6_LoadShadowRegister_CC61((uint16)1200*mV/5000);
CCU6_EnableST_T12();
CCU6_StartTmr_T12();
}
}
}
void uart2_rx_callback(void){
if(UART2->SCON.bit.RI == 1){
UART2->SCONCLR.reg = UART_MASK_INT_RI;
if('a' == UART2->SBUF.reg){
// Port_ChangePin(LED7,PORT_ACTION_SET);
// printf("LED1 is ON ");
flag = 0;
Bdrv_Set_Bridge(Ch_En, Ch_On, Ch_PWM, Ch_PWM);
}
if('b' == UART2->SBUF.reg){
// Port_ChangePin(LED7,PORT_ACTION_CLEAR);
flag = 1;
Bdrv_Set_Bridge(Ch_PWM, Ch_PWM, Ch_En, Ch_On);
}
}
}
本来想通过lcd屏幕来显示相关信息的,但是调试中发现SSC1模块初始化没问题,只要一初始化lcd屏幕电机就不运行了卡在这里半天,还没找到具体的原因所以这里就通过串口来显示了,其实通过串口显示更方便一些不需要接额外的线。
只有注册用户才能在此添加评论。 如果您已经注册,请登录。 如果您还没有注册,请注册并登录。