RA-Eco-RA4M2 v2.0 延续了瑞萨一贯的高品质,在 100MHz 的高频驱动下,提供卓越的算力与安全保障。
内核大脑: 100MHz Arm Cortex-M33,支持 TrustZone 安全架构。
存储空间: 512KB Flash + 128KB SRAM(含 ECC 与奇偶校验)+ 8KB Data Flash(EEPROM 级别)。
丰富外设: 全速 USB 2.0、CAN 2.0B、SDHI/MMC 接口,支持 CTSU 电容触摸传感。
便捷开发: 板载 USB 转 TTL(直连串口)、标准 SWD 调试口、2 个 PMOD 扩展口。
板载交互: 1个复位键、2个用户按键、2个触摸按键、3个高亮 LED。
要完成小直流电机驱动需要设计引脚驱动三极管电路如图:
使用gptime可以驱动三极管导通,L1处放置DC小电机,在R1端口接ADC可以检测电流大小,如此可以搭建电流闭环控制。
设置定时器如下:
设置ADC如下:
设置扫描转换通道channel0
编写定时器使能和ADC转换程序如下:
volatile bool scan_complete_flag = false;
void adc_callback(adc_callback_args_t * p_args)
{
FSP_PARAMETER_NOT_USED(p_args);
scan_complete_flag = true;
}
uint16_t Read_ADC_Voltage_Value(void);
uint16_t Read_ADC_Voltage_Value(void)
{
uint16_t adc_data;
double a0;
(void)R_ADC_ScanStart(&g_adc0_ctrl);
while (!scan_complete_flag) //等待转换完成标志
{
;
}
scan_complete_flag = false; //重新清除标志位
/* 读取通道0数据 */
R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_data);
/* ADC原始数据转换为电压值(ADC参考电压为3.3V) */
a0 = (double)(adc_data*3.3/4095);
// return a0;
return adc_data;
}
double a0;
uint16_t adc_data1=0;
//uint16_t adc_data2=0;
/*******************************************************************************************************************//**
* main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function
* is called by main() when no RTOS is used.
**********************************************************************************************************************/
void hal_entry(void)
{
/* TODO: add your own code here */
R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
fsp_err_t err = FSP_SUCCESS;
/********************************************************************
* 开启PWM
*/
/* Initializes the module. */
err = R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);
/* Handle any errors. This function should be defined by the user. */
assert(FSP_SUCCESS == err);
/* Start the timer. */
(void) R_GPT_Start(&g_timer0_ctrl);
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);
R_BSP_SoftwareDelay (1000, BSP_DELAY_UNITS_MILLISECONDS);
err = R_GPT_PeriodSet(&g_timer0_ctrl, 10000);//频率
assert(FSP_SUCCESS == err);
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);//不加延时可能会设置不成功
err = R_GPT_DutyCycleSet(&g_timer0_ctrl, 8000, GPT_IO_PIN_GTIOCB);//占空比
assert(FSP_SUCCESS == err);
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);
err = R_GPT_Reset(&g_timer0_ctrl);
assert(FSP_SUCCESS == err);
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);
while(1)
{
(void) R_ADC_ScanStart(&g_adc0_ctrl);
scan_complete_flag = false;
while (!scan_complete_flag)
{
/* Wait for callback to set flag. */
}
err =R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_data1);
assert(FSP_SUCCESS == err);
a0=(adc_data1/4095.0)*3.3;
// err =R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_5, &adc_data2);
// assert(FSP_SUCCESS == err);
// a5=(adc_data1/4095.0)*3.3;
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);
}
最后是接线图:

运行结果正常,可以在此基础上设计PI调节器达到闭环控制的目标
更多回帖