stc8A8k64D4的adc+dma 奇怪问题
本帖最后由 taijing33 于 2022-6-9 15:53 编辑我按照厂家提供的例子,自己改的程序。使用了9路adc口,
P1_MODE_IN_HIZ( GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6);
P0_MODE_IN_HIZ( GPIO_Pin_5 | GPIO_Pin_6); //P0.0~P0.6 ÉèÖÃΪ¸ß×èÊäÈë
然后adc功能和dma初始化 如下
#define ADC_CH 9 /* 1~16, ADC转换通道数, 需同步修改转换通道 */
#define ADC_DATA 68 /* 6~n, 每个通道ADC转换数据总数, 2*转换次数+4, 需同步修改转换次数 */
#define BMM_ADDR 0x800 /* BMMÊý¾Ý´æ·ÅµØÖ· */
/************* ±¾µØ±äÁ¿ÉùÃ÷ **************/
bit BmmFlag;
u8 xdata BmmAdBuffer ;
void BMM_AD_init(void)
{
ADC_InitTypeDef ADC_InitStructure; //????
BMM_ADC_InitTypeDef BMM_ADC_InitStructure; //????
//----------------------------------------------
P1_MODE_IN_HIZ( GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6);
P0_MODE_IN_HIZ( GPIO_Pin_5 | GPIO_Pin_6); //P0.0~P0.6 ÉèÖÃΪ¸ß×èÊäÈë
//----------------------------------------------
ADC_InitStructure.ADC_SMPduty = 31; //ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)
ADC_InitStructure.ADC_CsSetup = 0; //ADC 通道选择时间控制 0(默认),1
ADC_InitStructure.ADC_CsHold = 1; //ADC 通道选择保持时间控制 0,1(默认),2,3
ADC_InitStructure.ADC_Speed = ADC_SPEED_2X1T; //设置 ADC 工作时钟频率 ADC_SPEED_2X1T~ADC_SPEED_2X16T
ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED; //ADC结果调整, ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
ADC_Inilize(&ADC_InitStructure); //初始化
ADC_PowerControl(ENABLE); //ADC电源开关, ENABLE或DISABLE
NVIC_ADC_Init(DISABLE,Priority_0); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
//----------------------------------------------
BMM_ADC_InitStructure.BMM_Enable = ENABLE; //BMM使能 ENABLE,DISABLE
BMM_ADC_InitStructure.BMM_Channel = 0x607f; //ADC通道使能寄存器, 1:使能, bit15~bit0 对应 ADC15~ADC0;0x607f一共使能了9个adc通道
BMM_ADC_InitStructure.BMM_Buffer = BmmAdBuffer; //ADC转换数据存储地址
BMM_ADC_InitStructure.BMM_Times = ADC_32_Times; //每个通道转换次数, ADC_1_Times,ADC_2_Times,ADC_4_Times,ADC_8_Times,ADC_16_Times,ADC_32_Times,ADC_64_Times,ADC_128_Times,ADC_256_Times
BMM_ADC_Inilize(&BMM_ADC_InitStructure); //初始化
NVIC_BMM_ADC_Init(ENABLE,Priority_0,Priority_0); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0~Priority_3; 总线优先级(低到高) Priority_0~Priority_3
BMM_ADC_TRIG(); //触发启动转换
}
取值操作方法如下
if(BmmFlag == 1)
{
BmmFlag = 0;RUN_LED = !RUN_LED;
tempvalue1 = BmmAdBuffer;
tempvalue1 = (tempvalue1 <<8 )+ BmmAdBuffer;
tempvalue2 = BmmAdBuffer;
tempvalue2 = (tempvalue2 <<8 )+ BmmAdBuffer;
tempvalue3 = BmmAdBuffer;
tempvalue3 = (tempvalue3 <<8 )+ BmmAdBuffer;
tempvalue4 = BmmAdBuffer;
tempvalue4 = (tempvalue4 <<8 )+ BmmAdBuffer;
BMM_ADC_TRIG();
}
其中tempvalue1 tempvalue2 tempvalue3 tempvalue4 是外部4路ntc测温的adc值。
现在只有tempvalue3 tempvalue4是正确的,tempvalue1 tempvalue2严重不对,而且在外部ntc未接的情况下,整个io悬空的情况下
ADC13和adc14 IO口有1V左右的电压。
ADC13和adc14 对应的io口是p0.5和p0.6。
我不用dma功能的话,这2个io口的adc功能是正常的。,
用户请先别修改程序, 直接下载"02-9路12位ADC转换-DMA-串口1(P3.1)返回结果-C语言"里的"ADC.hex"测试.
下载时选择主频11.0592MHZ. 测试时, 电脑的串口助手设置115200,8,n,1.
测试截图: 其中通道5、6未加电压。因为我的分压电阻电压是1/8~7/8,一次接7个输入端测试。
后期技术问题直接电: 0513-55012928 ,就会安排销售支持你,销售会给你拉专业技术支持组个技术群,就搞定了。
这个是测试数据。@flame123
咖啡色牛奶 发表于 2022-6-15 17:36
这个是测试数据。@flame123
是的,这个芯片我没用过,估计DMA最大一次能搬运的就是256个字节,你发多了,估计指针飞了或者溢出了,所以显示接收的是乱码,你可以尝试,把数据加个缓存,收256个就搬走,然后重新开始收。
页:
[1]